← [ BACK_TO_NOTES ]

crypto.getRandomValues

Web Crypto API 的 getRandomValues 方法,用于生成密码学安全的随机数。

#concept #evergreen #javascript #frontend #browser #security

[!info] related notes

crypto.getRandomValues

一句话定义

crypto.getRandomValues() 是 Web Crypto API 提供的方法,使用密码学安全的伪随机数生成器 (CSPRNG) 填充 TypedArray,适用于生成密码、令牌等安全敏感场景。

核心机制

const array = new Uint32Array(1);
crypto.getRandomValues(array);
console.log(array[0]); // 0 到 4294967295 之间的安全随机整数
  • 接受 Int8Array、Uint8Array、Uint16Array、Uint32Array 等 TypedArray
  • 原地填充数组,返回同一个数组
  • 底层使用操作系统级别的熵源(如 /dev/urandom)

环境兼容性

环境支持情况使用方式
浏览器✅ 完全支持(包括 IE11)window.crypto.getRandomValues() 或全局 crypto.getRandomValues()
Node.js 19+✅ 全局可用直接使用 crypto.getRandomValues()
Node.js 15-18⚠️ 需要引入const { webcrypto } = require('crypto'); webcrypto.getRandomValues(...)
Node.js 14-❌ 不支持使用 require('crypto').randomBytes

最小例子:生成安全随机整数

function getSecureRandomInt(max) {
  const array = new Uint32Array(1);
  crypto.getRandomValues(array);
  return array[0] % max; // 注意:取模有极微小偏差,日常使用可接受
}

// 生成 0-99 之间的随机数
const randomNum = getSecureRandomInt(100);

与 Math.random 的核心区别

特性Math.random()crypto.getRandomValues()
安全性❌ 伪随机,可预测✅ 密码学安全
随机源xorshift128+ 算法操作系统熵池
适用场景动画、游戏、非安全场景密码、令牌、密钥生成
性能更快稍慢(但可忽略)
可预测性收集足够输出可推算不可推算

常见使用场景

  1. 生成随机密码
  2. 生成 CSRF Token
  3. 生成 API Key
  4. Fisher-Yates 安全洗牌
  5. 生成 UUID/随机 ID

注意事项

  • Modulo Bias:使用 % 取模会引入极微小偏差,生成密码长度时可忽略;若需严格均匀,需使用 rejection sampling
  • 同步方法:getRandomValues 是同步的;若需异步随机数,使用 crypto.randomUUID() 或 crypto.subtle.generateKey
创建于 2026/3/30 更新于 2026/7/15
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本