Cipher 密码能力示例
功能说明
本工程将密码能力按算法或用途拆分为独立页面,演示 OpenHarmony Lite 应用调用 @system.cipher 的基本流程,并统一覆盖 AES、摘要、HMAC、Base64、安全随机数、NV 密钥存储、RSA 和 ECC 能力。
| 页面 | 主要接口 | 状态 |
|---|---|---|
| AES-CBC | cipher.aes |
可运行 |
| AES-ECB | cipher.aes |
可运行 |
| SHA-256 | cipher.sha、shaInit、shaUpdate、shaFinal |
可运行 |
| MD5 | cipher.md5FromString |
可运行,仅用于兼容性场景 |
| HMAC-SHA256 | cipher.hmacSha256、hmacSha256Bytes、md5FromBytes |
可运行 |
| Base64 | cipher.base64Encode、base64Decode |
可运行;Base64 不提供机密性保护 |
| 安全随机数 | cipher.generateRandomBytes、generateRandomNumber |
可运行 |
| 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.hml、index.css 和 index.js,页面清单同步登记在 entry/src/main/config.json 中。
构建与安装
- 使用 DevEco Studio 5.0 Release 打开
CipherSample目录。 - 配置工程签名并连接 HiDiTing 开发板。
- 构建并安装 HAP,启动应用后从首页选择算法。
- 在页面查看结果,同时通过串口日志核对成功或失败回调。
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 中的 bundleName、vendor 和版本信息;新增算法页面时,还需要同时添加 HML、CSS、JS 文件,并把路由加入页面清单。