1# 安全随机数生成
2
3> **说明:**
4>
5> 从API version 12开始,轻量级智能穿戴设备支持获取随机数相关操作。
6
7随机数主要用于临时会话密钥生成和非对称加密算法密钥生成等场景。在加解密场景中,安全随机数生成器需要具备随机性,不可预测性,与不可重现性。当前系统生成的随机数满足密码学安全伪随机性要求。
8
9
10开发者可以调用接口,完成以下功能:
11
12
13- 生成指定长度的安全随机数,并将其用于生成对应的密钥。
14
15- 指定随机种子,生成一系列的随机序列。
16
17
18在开发前,开发者应该先对加解密基础知识有一定了解,并熟知以下随机数相关的基本概念:
19
20
21- **内部状态**
22
23  代表随机数生成器内存中的数值,当内部状态相同时,随机数生成器会生成固定的随机数序列。
24
25- **随机种子**
26
27  一个用来对伪随机数的内部状态进行初始化的数据,随机数生成器通过种子来生成一系列的随机序列。
28
29  当前OpenSSL实现方式,随机数生成器内部状态是不断变化的,即使设置相同的种子,生成的随机数序列也不会相同。
30
31
32## 支持的算法与规格
33
34随机数生成算法使用OpenSSL的RAND_priv_bytes接口生成安全随机数。
35
36| 算法 | 长度(Byte) |
37| -------- | -------- |
38| CTR_DRBG | [1, INT_MAX] |
39
40
41## 开发步骤
42
431. 调用[cryptoFramework.createRandom](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreaterandom),生成随机数实例。
44
452. (可选)设置DataBlob数据,调用[Random.setSeed](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#setseed),为随机数生成池设置种子。
46
473. 设置指定字节长度,调用[Random.generateRandom](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generaterandom)或[Random.generateRandomSync](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#generaterandomsync10),生成安全随机数。
48
49   指定字节长度范围为1~INT_MAX。
50
51- 通过await返回异步结果:
52  ```ts
53  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
54
55  async function doRand() {
56    let rand = cryptoFramework.createRandom();
57    let seed = new Uint8Array([1, 2, 3]);
58    rand.setSeed({ data: seed });
59    let len = 12;
60    let randOutput = await rand.generateRandom(len);
61    console.info('rand output:' + randOutput.data);
62  }
63  ```
64
65- 同步返回结果:
66  ```ts
67  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
68  import { BusinessError } from '@kit.BasicServicesKit';
69
70  function doRandBySync() {
71    let rand = cryptoFramework.createRandom();
72    let len = 24; // Generate a 24-byte random number.
73    try {
74      let randData = rand.generateRandomSync(len);
75      if (randData != null) {
76        console.info("[Sync]: rand result: " + randData.data);
77      } else {
78        console.error("[Sync]: get rand result fail!");
79      }
80    } catch (error) {
81      let e: BusinessError = error as BusinessError;
82      console.error(`do rand failed, ${e.code}, ${e.message}`);
83    }
84  }
85  ```
86