鸿蒙三方库 | harmony-utils之EncryptUtil RSA非对称加密详解
·
前言
RSA是非对称加密算法,使用公钥加密、私钥解密,适用于密钥交换、数字签名等场景。@pura/harmony-utils 的 EncryptUtil 封装了RSA加解密方法。本文将从API说明、代码实战、进阶用法、常见问题等多个维度进行全面讲解,帮助开发者快速掌握并应用到实际项目中。

一、RSA加解密核心API
EncryptUtil 提供了以下RSA方法:
| 方法 | 说明 | 返回类型 | 使用场景 |
|---|---|---|---|
encryptRSA(data, publicKey) |
RSA公钥加密 | string | 数据加密 |
decryptRSA(data, privateKey) |
RSA私钥解密 | string | 数据解密 |
generateRSAKeyPair() |
生成RSA密钥对 | KeyPair | 密钥生成 |
1.1 核心特性
- 简洁易用:封装复杂逻辑为一行调用,降低使用门槛
- 类型安全:完整的TypeScript类型定义,编译期即可发现错误
- 异常处理:内置异常捕获机制,避免运行时崩溃
- 密钥对生成:支持一键生成RSA公私钥对
1.2 RSA与AES对比
| 特性 | RSA | AES |
|---|---|---|
| 密钥类型 | 公钥+私钥 | 单一密钥 |
| 速度 | 慢 | 快 |
| 数据长度 | 有限制 | 无限制 |
| 适用场景 | 密钥交换 | 数据加密 |
二、完整使用步骤
2.1 安装依赖
ohpm install @pura/harmony-utils
2.2 生成密钥对
import { EncryptUtil } from '@pura/harmony-utils';
Button('生成RSA密钥对')
.width('100%')
.onClick(async () => {
try {
let keyPair = await EncryptUtil.generateRSAKeyPair();
this.result = `公钥: ${keyPair.publicKey.substring(0, 30)}...\n私钥: ${keyPair.privateKey.substring(0, 30)}...`;
} catch (e) {
this.result = '异常: ' + e;
}
})
2.3 RSA加密
Button('RSA公钥加密')
.width('100%')
.onClick(async () => {
try {
let plaintext = 'Hello RSA!';
let publicKey = 'MIIBIjANBg...';
let encrypted = await EncryptUtil.encryptRSA(plaintext, publicKey);
this.result = `原文: ${plaintext}\n密文: ${encrypted}`;
} catch (e) {
this.result = '异常: ' + e;
}
})

三、完整页面示例
import { EncryptUtil } from '@pura/harmony-utils';
@Entry
@Component
struct RSADemo {
@State result: string = '';
private publicKey: string = '';
private privateKey: string = '';
build() {
Column({ space: 12 }) {
Button('生成密钥对').width('100%').onClick(async () => {
let keyPair = await EncryptUtil.generateRSAKeyPair();
this.publicKey = keyPair.publicKey;
this.privateKey = keyPair.privateKey;
this.result = '密钥对已生成';
});
Button('加密解密').width('100%').onClick(async () => {
let encrypted = await EncryptUtil.encryptRSA('Hello', this.publicKey);
let decrypted = await EncryptUtil.decryptRSA(encrypted, this.privateKey);
this.result = `原文: ${decrypted}`;
});
Text(this.result).fontSize(14).fontColor('#333333')
}
.padding(16)
}
}
四、进阶用法
4.1 混合加密(RSA+AES)
import { EncryptUtil } from '@pura/harmony-utils';
async function hybridEncrypt(data: string, publicKey: string): Promise<string> {
let aesKey = RandomUtil.randomString(16);
let encryptedData = await EncryptUtil.encryptAES(data, aesKey);
let encryptedKey = await EncryptUtil.encryptRSA(aesKey, publicKey);
return JSON.stringify({ key: encryptedKey, data: encryptedData });
}
4.2 数字签名
async function signData(data: string, privateKey: string): Promise<string> {
let hash = await EncryptUtil.sha256(data);
return await EncryptUtil.encryptRSA(hash, privateKey);
}
五、注意事项
- 数据长度限制:RSA加密有数据长度限制,通常不超过密钥长度
- 性能问题:RSA比AES慢得多,不适合加密大量数据
- 密钥安全:私钥必须安全存储,不能泄露
- 初始化依赖:使用前需确保
AppUtil.init()已调用 - 混合加密:大数据场景建议使用RSA+AES混合加密
六、常见问题
Q1: RSA加密数据长度有限制吗?
有限制,加密数据长度不能超过密钥长度减去填充长度。
Q2: 公钥和私钥可以互换使用吗?
可以,公钥加密私钥解密,或私钥加密公钥解密(用于签名)。
Q3: RSA密钥长度推荐多少?
推荐2048位或以上,1024位已不安全。
Q4: 如何安全存储私钥?
建议使用AssetUtil或安全存储,不要明文存储。


总结
EncryptUtil 的RSA加解密方法为非对称加密提供了便捷支持。本文详细介绍了核心API、使用步骤、完整示例、进阶用法以及常见问题的解决方案。开发者可以利用RSA实现密钥交换、数字签名等功能。
本文基于
@pura/harmony-utils工具库,更多功能请参考官方文档与后续系列文章。
更多推荐




所有评论(0)