Cipher 密码能力示例

功能说明

本工程将密码能力按算法或用途拆分为独立页面,演示 OpenHarmony Lite 应用调用 @system.cipher 的基本流程,并统一覆盖 AES、摘要、HMAC、Base64、安全随机数、NV 密钥存储、RSA 和 ECC 能力。

页面 主要接口 状态
AES-CBC cipher.aes 可运行
AES-ECB cipher.aes 可运行
SHA-256 cipher.shashaInitshaUpdateshaFinal 可运行
MD5 cipher.md5FromString 可运行,仅用于兼容性场景
HMAC-SHA256 cipher.hmacSha256hmacSha256Bytesmd5FromBytes 可运行
Base64 cipher.base64Encodebase64Decode 可运行;Base64 不提供机密性保护
安全随机数 cipher.generateRandomBytesgenerateRandomNumber 可运行
NV 密钥存储 Key ID 查询、保存、读取、覆盖、删除 可运行,测试结束后自动清理
RSA PKCS#1/OAEP 加解密、PKCS#1/PSS 签名验签 需在本地配置 PEM 测试密钥
ECC 密钥生成、密钥协商、签名验签 可运行

工程结构

CipherSample/
├── entry/src/main/config.json                  # 应用、Ability 与页面路由
└── entry/src/main/js/MainAbility/
    ├── app.js                                  # 运行时随机材料与 RSA 密钥空占位
    └── pages/
        ├── index/                              # 算法导航
        ├── aes_cbc/                            # AES-CBC
        ├── aes_ecb/                            # AES-ECB
        ├── hash_256/                           # SHA-256
        ├── md5/                                # MD5
        ├── hmac/                               # HMAC-SHA256
        ├── base64/                             # Base64
        ├── trng/                               # 安全随机数
        ├── nv/                                 # NV 密钥闭环
        ├── rsa/                                # RSA 加解密与签名验签
        └── ecc/                                # ECC 密钥与签名能力

每个页面均包含同名的 index.hmlindex.cssindex.js,页面清单同步登记在 entry/src/main/config.json 中。

构建与安装

  1. 使用 DevEco Studio 5.0 Release 打开 CipherSample 目录。
  2. 配置工程签名并连接 HiDiTing 开发板。
  3. 构建并安装 HAP,启动应用后从首页选择算法。
  4. 在页面查看结果,同时通过串口日志核对成功或失败回调。

AES/HMAC 密钥、IV、ECC 协商盐值和 NV 测试数据均在应用运行时通过安全随机数接口生成。RSA 测试密钥由开发者在调试时自行准备,不在示例中提供固定值,避免测试材料被误用于产品或被日志长期保存。

准备 RSA 本地测试密钥

@system.cipher 的 RSA 接口接收调用者提供的 PEM 公钥或私钥,当前没有生成 RSA 密钥对的 JS 接口。因此,运行 RSA 页面前需要自行生成 2048、3072 和 4096 位测试密钥。例如,在独立测试目录中执行:

2048,3072,4096 | ForEach-Object {
    openssl genrsa -traditional -out "rsa_$($_)_private.pem" $_
    openssl rsa -in "rsa_$($_)_private.pem" -pubout -out "rsa_$($_)_public.pem"
}

-traditional 用于让 OpenSSL 3 输出当前示例已验证的 PKCS#1 私钥格式;使用不支持该选项的旧版 OpenSSL 时去掉此参数。

使用 Get-Content -Raw <PEM文件> | ConvertTo-Json -Compress 将 PEM 转为包含换行转义的 JavaScript 字符串,在应用调试时临时填入 entry/src/main/js/MainAbility/app.js 的六个空变量。测试完成后清除变量内容和临时 PEM 文件。RSA 接口不接收 X.509 证书;HAP 的应用签名证书属于构建配置,不能作为 RSA 业务密钥使用。

运行与验收

  • AES:先加密再解密,解密结果应与页面中使用的原文一致。
  • SHA-256:整段计算与分段计算应得到相同摘要。
  • HMAC、MD5、Base64、随机数:页面应显示成功结果,串口不应出现失败回调。
  • NV 密钥存储:页面最终应显示“保存→读取→覆盖→校验→删除”闭环通过;失败时同样尝试清理测试 Key ID。
  • RSA:未配置本地密钥时,页面提示按 README 准备密钥,不调用密码接口;配置后选择对应长度,使用 PKCS#1 或 OAEP 加密再解密,解密结果应与原文一致,使用 PKCS#1 或 PSS 签名后应验签成功。
  • ECC:应能生成密钥对;通信双方使用各自私钥和对端公钥计算出的共享密钥应一致;签名后应验签成功。

二次开发

示例生成的随机材料和本地 RSA 测试密钥仅用于开发验证。产品代码必须使用密码学安全随机数生成密钥,采用受保护的密钥存储与轮换方案,并避免把密钥、明文或完整认证数据写入日志。复制本工程创建应用时,需要修改 entry/src/main/config.json 中的 bundleNamevendor 和版本信息;新增算法页面时,还需要同时添加 HML、CSS、JS 文件,并把路由加入页面清单。