HandyTools Hub

← 全部指南

随机性入门:从抛硬币到安全随机数生成器

2026-09-03

随机性无处不在:桌上游戏的掷骰、解决争端的抛硬币、随机密码、打乱歌单。但「随机」到底指什么,按钮按下得到的结果,和保护你密码的随机性是不是同一种?

这篇指南解释大多数人遇到的两种随机性,为什么简单洗牌并非总是够用,以及何时一个快速生成器完全没问题。

两种随机性

「随机」一词涵盖两种不同的东西:

  • 统计随机性——结果不可预测且均匀分布,但不必安全。掷骰是好的例子:你猜不到,但你也不会用它生成银行卡密码。
  • 密码学随机性——不可预测能抵御试图猜测它的攻击者。这是密码、令牌和密钥所需的。它从操作系统熵或硬件随机数生成器等来源获取熵。

区分很重要,因为两者不可互换。语言里普通的 Math.random() 调用对游戏和决策没问题,但绝不适用于任何安全敏感场合。

随机数生成器如何工作

一个产生不可预测数字的生成器大致这样运作:

  1. 种子。 它从一个种子开始——一个决定整个序列的数字。
  2. 算法。 它对种子运行确定性算法,产生一串数字。
  3. 周期。 因为它是确定性的,序列最终会重复。对常规使用,周期长到无所谓。

这些被称为伪随机数生成器:如果你知道种子,它们是确定且可复现的,但序列看起来是随机的。这对多数用途没问题。

密码学安全的生成器更进一步。它们不以同样方式播种——它们引入真实世界的熵,因此即使攻击者知道算法,也无法预测输出。这就是密码生成器使用 crypto.getRandomValues() 而非普通洗牌的原因。

何时简单生成器足够

对多数日常用途,简单随机生成器完全够用:

  • 在选项之间做决定——去哪家餐厅、谁先走、看什么。
  • 为游戏掷骰子。
  • 从名单里抽一个名字。
  • 打乱歌单或一副牌。

这些都不需要安全;只需看起来公平、不可预测。

何时需要真正的安全

如果结果要保护什么东西,就需要密码学随机性:

  • 密码和口令短语——一个随机但不安全的生成器是隐患。
  • 令牌和 API 密钥——它们本意就是不可猜测。
  • 会话 ID 和加密密钥——重点在于谁也无法预测。

关键区分:如果一个「随机」值是攻击者可能猜到的秘密,就必须来自密码学安全来源。如果只是为了娱乐或公平决定,简单生成器就够了。选择并保护好这些安全生成器产出的密码,是另一门学问——见密码安全指南

快速参考

  • 两种随机性:统计随机(不可预测但不安全——骰子)与密码学随机(抗猜测——密码、令牌、密钥)。
  • 两者不可互换:普通 Math.random() 用于游戏和决策没问题,用于任何涉密场景就错了。
  • 伪随机生成器有种子、确定性、最终会重复;密码学安全生成器混入真实熵,输出无法被预测。
  • 餐厅选择、掷骰、抽签、洗牌用简单生成器就够——没有需要保护的东西。
  • 如果一个「随机」值是攻击者可能猜到的秘密,就必须来自密码学安全来源。

开始使用

如果你需要一个数字、抛硬币或从列表里选一个,随机数生成给你一个范围的随机数;想解决犹豫不决,随机决策抛硬币、掷骰子或从你自定的选项里挑——都在浏览器里。真正的安全请用 Password 生成器,它从密码学安全来源取随机数。