随机数在网上到处都是,您的安全性取决于它们。让我们看看您是否正确使用它们。
随机数在Web应用程序安全性中起关键作用。它们用于会话标识符,密码,加密密钥等。但是,如果不安全地实施,它们可能会导致攻击者可以利用未经授权访问敏感信息的漏洞。
tldr
- 大多数随机发电机并非真正随机。他们使用看起来随机的数学
- 请勿在javascript中使用
Math.random()
或python中的random
- 在javascript中使用koude2,nodejs中的koude3模块和python中的koude4
- 不要尝试实现自己的随机生成算法
- 安全随机数的不正确用法可能会使您的应用程序脆弱
随机功能如何工作
有两种主要类型的随机数生成器(RNG):伪随机数生成器(PRNGS)和TRUE随机数生成器(TRNGS)。
伪随机数生成器(PRNGS)
PRNG是最常用的RNG类型。它们通过使用算法来生成似乎是随机的数字序列来起作用。该算法以输入为初始值并基于它产生一系列数字。
PRNG中使用的常见算法是Mersenne-Twister和linear congruential generator (LCG)。
这些算法获得了一个名为seed
的初始数字。他们通过添加先前的随机数,转移和执行XOR操作员来生成输出来更改它。输出看起来像一个随机数,尽管它只是公式的输出。
如果您继续执行任何PRNG,它最终将一遍又一遍地生成相同的数字。任何PRNG都有固定的数字长度,可以在重新开始之前生成。
真正的随机数生成器(TRNG)
trngs基于本质上随机的物理过程生成真正的随机数。这些过程包括大气噪声,放射性衰减和热噪声。 TRNG测量物理过程并将其转换为随机数。
随机功能漏洞
种子和随机数生成算法都可能具有弱点。
预言
您可以说可预测性是弱随机数发生器的主要漏洞。 PRNG是可以预见的,因为它们基于数学公式。因此,如果您知道种子和最后一个随机数,则可以预测下一个随机数。这可能导致严重的脆弱性。
例如,考虑一个基于随机令牌单词的忘记密码功能。如果可以预测令牌,则攻击者可以重置任何用户的密码。
碰撞
除了可预测性外,一些质量低的随机发电机经常产生重复值。这会增加碰撞的风险。
考虑为其用户生成随机会话令牌的应用程序。产生重复会议令牌的机会与两个因素有关:
- 随机空间的大小(会话时间令长度)
- 随机选择的质量
短长令牌将有更高的碰撞机会。不良随机生成器不会生成所有可能的值。这可能导致漏洞,用户可以看到他人的数据。
种子泄漏或操纵
与随机数发生器有关的另一个漏洞是选择弱种子。 PRNG总是生成具有相同初始种子值的相同数字序列。如果攻击者可以找到二手种子或操纵它,则可以轻松生成相同的随机数。
在Pratice中,黑客使用不同的方法来预测下一个随机数。某些方法可能涉及统计分析,而另一些方法可能涉及反向工程发电机的算法。
如何使用安全的随机数
使用密码固定的随机数生成算法是安全生成随机数的关键。这些算法会生成不可预测的随机数,攻击者无法轻易猜测。这些算法的输出对蛮力攻击具有抵抗力,并且在统计学上是强大的。
除非您知道自己在做什么,否则您不应尝试实施自己的一个。相反,始终使用已知为安全的随机库。
让我们看一些使用不同编程语言使用安全随机库的示例。
JavaScript
Math.random()
函数不适合加密目的,因为它不是真正的随机性,可以被攻击者预测或操纵。
要在JavaScript中生成一个安全的随机数,您可以使用koude2。 Crypto.getRandomValues()
方法使您可以获得密码强的随机值。这是生成安全随机数的示例代码:
function generateRandomNumber() {
const array = new Uint32Array(1); // Create a 32-bit unsigned integer array
window.crypto.getRandomValues(array); // Fill the array with random values
return array[0]; // Return the first element of the array as the random number
}
console.log(generateRandomNumber()); // Output a random number between 0 and 4294967295
nodejs
在nodejs中,koude3模块可用于生成密码安全的随机数。以下代码示例说明了加密模块生成随机数的使用:
const crypto = require('crypto');
function generateRandomNumber() {
const randomBytes = crypto.randomBytes(4); // Generate 4 random bytes
const hexValue = randomBytes.toString('hex'); // Convert the bytes to a hex string
const intValue = parseInt(hexValue, 16); // Convert the hex string to an integer
return intValue;
}
console.log(generateRandomNumber()); // Output a random number between 0 and 4294967295
Python
在Python中,random
模块可用于生成随机数。但是,它在密码上并不安全。相反,您可以使用koude4模块生成密码固定的随机数。以下代码示例说明了使用秘密模块在生成一个随机数中的使用:
import secrets
def generate_random_number():
random_number = secrets.randbits(32) # Generate a 32-bit random number
return random_number
print(generate_random_number()) # Output a random number between 0 and 4294967295
结论
计算机中的随机数是数学公式和可预测的。并非每个随机数生成器都适用于密码和安全使用。随机数只是安全系统设计和实现中的一个元素。还有许多其他事情,例如种子生成,密钥管理和整体安全系统设计,它们非常重要且难以正确。 Crypto 101是开始了解有关密码学的好地方。
在SmartScanner Security Blog上阅读更多信息。