对于计算机而言,随机性是一个难题。 因此,大多数产生随机性的功能都不被认为是密码安全的 。 这意味着攻击者可能会很好地猜测非安全随机性生成器生成了多少数字。
如何攻击随机性?
许多非安全随机性(或熵)生成器会执行以下操作:
function getRandom ( timestamp, maxNumber ) {// Take the deterministic hash of the timestampconst hashedTime = sha256(timestamp)// Reduce the hash to within the range [0, maxNumber)return hashedTime % maxNumber
}
该函数(虽然忽略了这么大的模数数学的一些实现细节)将返回基于时间戳输入的随机数,称为seed 。 如果我传入许多不同的时间戳,则各种输出将显示为random 。 这是弱伪随机数生成器的一个示例。
如果尝试执行以下操作,那么弱伪随机数生成器将完全正常工作:
- 创建应用程序的样本数据
- 编写视频游戏引擎
- 等...
但是,如果尝试以下操作,则弱伪随机性可能会带来灾难性的危险 :
强伪随机性(加密安全)
像Qvault这样的纯软件系统最多只能生成强大的伪随机数据,因为我们正在研究确定性系统。 如果没有外部的熵源(例如有人掷骰子并告诉计算机每个输出),我们将受到伪随机性的摆布。
crypto.randomBytes()
Node的内置crypto.randomBytes是基于openssl的加密安全随机数生成器。 根据用户的操作系统,randomBytes将使用
/ dev / urandom (unix)
要么
CryptoGenRandom (Windows)
尽管仍然是伪随机源,但重要的是攻击者无法猜测它们。 换句话说,在使用crypto.randomBytes() 在Qvault中生成恢复代码后 ,攻击者无法重新创建该代码。
我该怎么办?
简而言之,每当需要原始随机字节时,请使用crypto.randomBytes() 。 如果您需要某个范围内的随机数(例如0-9之间的随机数) ,请使用使用crypto.randomBytes()作为熵源的无偏函数。 例如:
节点随机数csprng
祝好运! 另外,请务必检查来源!
莱恩·瓦格纳(Lane Wagner)
- 在媒体上关注我们! https://medium.com/qvault
- 在Twitter上关注@wagslane
先前发布在https://qvault.io/2019/07/03/randomness-and-entropy-in-node-and-electron/
From: https://hackernoon.com/randomness-and-entropy-in-node-and-electron-6af83yi7