#HarmonyOS NEXT体验官# 数据加密 1. 概念和算法分类-密钥生成 原创
什么是加密
⚫ 加密是常用的安全保密手段,把正常信息变为乱码传送,对方收到后再还原(解密)
⚫ 加密技术包括两大元素:算法,密钥
⚫ 把信息与一串文字(密钥)结合产生密文的步骤,就是算法
⚫ 密钥也是从一种算法得来的,用来还原信息(解密)
加密算法分类
本教程介绍最常见的分类,仅讲解常识和使用,并不探讨算法本身的数学逻辑
⚫ 数据编码/解码:UTF-8、Base64 (无需密钥就能加密,可100%还原;通常用于减少体积,限制密文字符范围)
⚫ 消息摘要:MD5、SHA1 (同样无需密钥来加密,基本无法还原;通常用于提取信息的唯一特征)
⚫ 对称加密:DES、3DES、AES、Blowfish (加密方,解密方都使用同一个密钥。简单易行,性能高)
⚫ 非对称加密:RSA、DSA、ECC (双方使用不同的密钥。发送方用公钥进行加密,接收方用私钥解密。公私钥是成对
生成的,如果没有与公钥对应的私钥,则无法解密。步骤比较复杂,性能不高)
HarmonyOS中的加密
⚫ 直接使用Crypto Architecture Kit(CAK),它屏蔽了第三方密码学算法库实现差异的算法框架,提供
加解密、签名验签、消息验证码、哈希、安全随机数、密钥派生等相关功能。
⚫ 开发者可以通过调用加解密算法框架服务,忽略底层不同第三方算法库的差异,实现迅捷开发。
⚫ CAK使用OpenSSL(加密库),不支持多线程加密。
对称加密
⚫ 加解密双方使用同一个密钥对完成数据加密、解密的操作。
⚫ 发送方使用一个密钥,对数据进行特殊算法处理成密文发送,接收方需使用同一个密钥及相同
算法的逆算法解密。
非对称加密
⚫ 使用成对的公钥和私钥,公钥公开,私钥保密。
⚫ 加密操作:使用公钥加密,持有私钥的人可解密。
⚫ 签名验证场景(例如HarmonyOS的App上架包):
- 开发者生成一对公私钥,就可以使用私钥对App包进行签名
- 开发者把公钥上传到应用商店方
- 应用商店方可通过公钥对签名数据做验证,检查App包是否被篡改
密钥生成与转换
随机生成算法库密钥对象
⚫ 指定生成算法库密钥对象(将外部二进制数据转换为算法库的密钥对象)
⚫ 根据密钥参数生成指定的算法库密钥对象
⚫ 获取算法库密钥对象的二进制数据
⚫ 对于非对称密钥,获取密钥对象的参数属性
AES 对称加密算法
⚫ 分组密码算法,分组长度为128位。
⚫ 密钥长度为128位、192位或256位。
⚫ 与3DES相比,安全性更高,处理速度更快。
RSA 非对称加密算法
⚫ 当前支持使用字符串参数和密钥参数两种方式生成RSA密钥。
⚫ 以字符串参数生成RSA密钥,具体的“字符串参数”由“RSA密钥类型”和
“素数个数”使用符号“|”拼接而成,用于在创建非对称密钥生成器时,指定
密钥规格。
使用密钥参数生成
⚫ RSA密钥参数,涉及三个整数,包括:
⚫ n:模数(Modulus),是私钥和公钥的公共参数。
⚫ sk:私钥指数(privateExponent),公式中常写作d。
⚫ pk:公钥指数(publicExponent),公式中常写作e。
使用密钥参数生成
⚫ 当创建非对称密钥生成器时,对于指定公/私钥参数生成RSA密钥的支持情况如表所示:
⚫ √:表示需要指定这一列中的具体属性,
来构成密钥参数。
⚫ ×:表示这一列中的具体属性对应某种密
钥参数,但是当前不支持通过该密钥参数
生成密钥。
随机生成对称密钥
⚫ 以AES为例,随机生成对称密钥(SymKey),并获得二进制数据。
⚫ 对称密钥对象可用于后续加解密操作,二进制数据可用于存储或运输。
随机生成对称密钥
⚫ 调用cryptoFramework.createSymKeyGenerator,指定字符串参数’AES256’,创建密钥算法为AES、密钥长度为
256位的对称密钥生成器(SymKeyGenerator)
⚫ 调用SymKeyGenerator.generateSymKey,随机生成对称密钥对象(SymKey)
⚫ 调用SymKey.getEncoded,获取密钥对象的二进制数据
随机生成对称密钥
mport cryptoFramework from '@ohos.security.cryptoFramework';
function testGenerateAesKey() {
// 创建SymKeyGenerator实例
let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256');
// 使用密钥生成器随机生成对称密钥
let promiseSymKey = symKeyGenerator.generateSymKey();
promiseSymKey.then(key => {
// 获取对称密钥的二进制数据,输出256位密钥。长度为32字节
let encodedKey = key.getEncoded();
console.info('key hex:' + encodedKey.data);
});
}
指定二进制数据转换对称密钥
⚫ 以3DES为例,根据指定的对称密钥二进制数据,生成密钥(SymKey)。即将
外部或存储的二进制数据转换为算法库的密钥对象,该对象可用于后续的加解
密等操作。
指定二进制数据转换对称密钥
⚫ 获取3DES二进制密钥数据,封装成DataBlob对象。
⚫ 调用cryptoFramework.createSymKeyGenerator,指定字符串参数’3DES192’,创建密钥算法为3DES、密钥长度为
192位的对称密钥生成器(SymKeyGenerator)。
⚫ 调用SymKeyGenerator.convertKey,根据指定的对称密钥二进制数据,生成对称密钥对象(SymKey)。
⚫ 调用SymKey.getEncoded,获取密钥对象的二进制数据。
指定二进制数据转换对称密钥
import cryptoFramework from '@ohos.security.cryptoFramework';
import { BusinessError } from '@ohos.base';
function genKeyMaterialBlob(): cryptoFramework.DataBlob {
let arr = [
0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56,
0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c,
0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72]; // 密钥长度为192位,即24字节。
let keyMaterial = new Uint8Array(arr);
return { data: keyMaterial };
}