news 2026/5/27 15:06:33

鸿蒙中 安全随机数的生成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
鸿蒙中 安全随机数的生成

本文同步发表于微信公众号,微信搜索程语新视界即可关注,每个工作日都有文章更新

一、安全随机数

安全随机数生成器需要具备三个核心特性:

特性说明
随机性生成的数字在统计上均匀分布
不可预测性无法根据已知的随机数序列预测后续值
不可重现性即使知道生成算法,也无法重现相同的序列

说明:当前系统生成的随机数满足密码学安全伪随机性要求,可用于加解密场景。

应用场景

场景说明
临时会话密钥生成如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实现会保持内部状态不断变化,即使相同种子也不会生成相同序列

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/7 16:32:37

roboDK--使用

工件去除工件表面油漆按Esc件即可。快捷键/ -- 显示/关闭坐标系名称:坐标系显示/关闭右键坐标系即可。

作者头像 李华
网站建设 2026/4/7 16:31:49

告别多账号内耗,小红书运营原来可以这么轻松

做小红书矩阵运营,每天一到工位,先花十几分钟挨个登录账号,反复扫码验证,刚处理完一个账号的私信,另一个的评论又炸了;来回切换APP、翻找消息,手忙脚乱还容易漏回复。其实想摆脱这种内耗&#x…

作者头像 李华
网站建设 2026/4/1 3:55:16

从特效 SDK 到 AI 动效平台:Neon Vibe Motion 的技术演进之路

多媒体中台在 B 站主要负责剪辑、拍摄、直播等业务场景的动效渲染,开发维护的 SDK 在后文统一称为特效 SDK。 传统的视频特效生产一般分三条链路: 三条链路存在一个困境:效果丰富度、实时可交互、生产效率,三者不可兼得。 那么能…

作者头像 李华
网站建设 2026/4/1 3:52:02

枪火地牢,推荐一个基于 .NET 9开发的地牢射击类型的游戏

枪火地牢《枪火地牢》(Gunfire Dungeon)是一款基于 Godot 4.4 Mono 与 .NET 9.0 打造的 2D 像素风 Roguelite 地牢射击游戏,采用经典俯视角与双摇杆操作方式,融合了《挺进地牢》和《Noita》的玩法精髓。游戏以多层随机生成的地牢为…

作者头像 李华
网站建设 2026/4/1 3:51:24

浅谈MIKE URBAN转SWMM的方法

01 前言近期有群友咨询MIKE URBAN怎么转换成SWMM的INP文件格式,其实这个是很简单的,前提是你对两个软件格式足够熟悉,另一方面,很多年前SWMM就开发了inpPNS软件。可以利用这个软件便可实现转换,小编抽时间给大家分享下…

作者头像 李华
网站建设 2026/4/8 0:37:00

Dijkstra算法时间复杂度真是O(n²)吗?我用C++生成1万节点图实测给你看

Dijkstra算法时间复杂度真是O(n)吗?我用C生成1万节点图实测给你看 在算法学习的道路上,我们经常被教科书告知Dijkstra算法的时间复杂度是O(n)。这个结论看似简单明了,但当你真正动手实现并测试时,会发现实际情况远比理论复杂。本文…

作者头像 李华