本文同步发表于微信公众号,微信搜索程语新视界即可关注,每个工作日都有文章更新
一、安全随机数
安全随机数生成器需要具备三个核心特性:
| 特性 | 说明 |
|---|---|
| 随机性 | 生成的数字在统计上均匀分布 |
| 不可预测性 | 无法根据已知的随机数序列预测后续值 |
| 不可重现性 | 即使知道生成算法,也无法重现相同的序列 |
说明:当前系统生成的随机数满足密码学安全伪随机性要求,可用于加解密场景。
应用场景
| 场景 | 说明 |
|---|---|
| 临时会话密钥生成 | 如TLS/SSL握手时的临时密钥 |
| 非对称加密算法密钥生成 | 如RSA、SM2密钥对生成 |
| 盐值生成 | 密码存储时的加盐 |
| 初始化向量IV | 对称加密的初始向量 |
版本支持
| 设备类型 | 最低API版本 |
|---|---|
| 标准设备 | API 9+ |
| 轻量级智能穿戴设备 | API 12+ |
二、随机数
定义:随机数生成器内存中的数值。
重要特性:当内部状态相同时,随机数生成器会生成固定的随机数序列。
随机种子
定义:一个用来对伪随机数的内部状态进行初始化的数据。
作用:随机数生成器通过种子来生成一系列的随机序列。
OpenSSL实现特性:随机数生成器内部状态是不断变化的,即使设置相同的种子,生成的随机数序列也不会相同。这与纯确定性算法不同,提供了更高的安全性。
三、支持的算法与规格
| 算法 | 说明 | 支持长度范围 |
|---|---|---|
| CTR_DRBG | 计数器模式确定性随机数生成器 | 1 ~ INT_MAX 字节 |
CTR_DRBG是一种基于计数器模式的确定性随机数生成器,在密码学中广泛应用,满足NIST SP 800-90A标准。
四、开发步骤
4.1 导入模块
import { cryptoFramework } from '@kit.CryptoArchitectureKit'; import { BusinessError } from '@kit.BasicServicesKit';4.2 步骤1:创建随机数实例
// 创建随机数实例 let rand = cryptoFramework.createRandom();4.3 步骤2:(可选)设置随机种子
// 为随机数生成池设置种子 let seed = new Uint8Array([1, 2, 3]); rand.setSeed({ data: seed });注意:种子设置是可选的。即使不设置种子,系统也会使用熵源自动初始化。
4.4 步骤3:生成安全随机数
支持两种方式:异步生成和同步生成。
方式一:异步生成(await返回结果)
async function doRand() { // 1. 创建随机数实例 let rand = cryptoFramework.createRandom(); // 2. (可选)设置种子 let seed = new Uint8Array([1, 2, 3]); rand.setSeed({ data: seed }); // 3. 生成12字节随机数 let len = 12; let randOutput = await rand.generateRandom(len); console.info('rand output:' + randOutput.data); } // 调用 doRand();方式二:同步生成(同步返回结果)
function doRandBySync() { // 1. 创建随机数实例 let rand = cryptoFramework.createRandom(); // 2. 生成24字节随机数 let len = 24; try { let randData = rand.generateRandomSync(len); if (randData.data.length !== 0) { console.info("[Sync]: rand result: " + randData.data); } else { console.error("[Sync]: get rand result fail!"); } } catch (error) { let e: BusinessError = error as BusinessError; console.error(`do rand failed, ${e.code}, ${e.message}`); } }五、注意事项
长度限制
| 限制项 | 说明 |
|---|---|
| 最小长度 | 1字节 |
| 最大长度 | INT_MAX(约2GB) |
种子设置
种子设置是可选的
即使不设置种子,系统也会自动使用熵源初始化
设置种子后,OpenSSL实现会保持内部状态不断变化,即使相同种子也不会生成相同序列