安全编码101:如何使用随机功能
#javascript #安全 #node #cryptography

随机数在网上到处都是,您的安全性取决于它们。让我们看看您是否正确使用它们。

随机数在Web应用程序安全性中起关键作用。它们用于会话标识符,密码,加密密钥等。但是,如果不安全地实施,它们可能会导致攻击者可以利用未经授权访问敏感信息的漏洞。

tldr

  • 大多数随机发电机并非真正随机。他们使用看起来随机的数学
  • 请勿在javascript中使用Math.random()或python中的random
  • 在javascript中使用koude2,nodejs中的koude3模块和python中的koude4
  • 不要尝试实现自己的随机生成算法
  • 安全随机数的不正确用法可能会使您的应用程序脆弱

随机功能如何工作

有两种主要类型的随机数生成器(RNG):伪随机数生成器(PRNGS)和TRUE随机数生成器(TRNGS)。

伪随机数生成器(PRNGS)

PRNG是最常用的RNG类型。它们通过使用算法来生成似乎是随机的数字序列来起作用。该算法以输入为初始值并基于它产生一系列数字。

PRNG中使用的常见算法是Mersenne-Twisterlinear congruential generator (LCG)

这些算法获得了一个名为seed的初始数字。他们通过添加先前的随机数,转移和执行XOR操作员来生成输出来更改它。输出看起来像一个随机数,尽管它只是公式的输出。

如果您继续执行任何PRNG,它最终将一遍又一遍地生成相同的数字。任何PRNG都有固定的数字长度,可以在重新开始之前生成。

真正的随机数生成器(TRNG)

trngs基于本质上随机的物理过程生成真正的随机数。这些过程包括大气噪声,放射性衰减和热噪声。 TRNG测量物理过程并将其转换为随机数。

随机功能漏洞

种子和随机数生成算法都可能具有弱点。

预言

您可以说可预测性是弱随机数发生器的主要漏洞。 PRNG是可以预见的,因为它们基于数学公式。因此,如果您知道种子和最后一个随机数,则可以预测下一个随机数。这可能导致严重的脆弱性。

例如,考虑一个基于随机令牌单词的忘记密码功能。如果可以预测令牌,则攻击者可以重置任何用户的密码。

碰撞

除了可预测性外,一些质量低的随机发电机经常产生重复值。这会增加碰撞的风险。

考虑为其用户生成随机会话令牌的应用程序。产生重复会议令牌的机会与两个因素有关:

  • 随机空间的大小(会话时间令长度)
  • 随机选择的质量

短长令牌将有更高的碰撞机会。不良随机生成器不会生成所有可能的值。这可能导致漏洞,用户可以看到他人的数据。

种子泄漏或操纵

与随机数发生器有关的另一个漏洞是选择弱种子。 PRNG总是生成具有相同初始种子值的相同数字序列。如果攻击者可以找到二手种子或操纵它,则可以轻松生成相同的随机数。

在Pratice中,黑客使用不同的方法来预测下一个随机数。某些方法可能涉及统计分析,而另一些方法可能涉及反向工程发电机的算法。

如何使用安全的随机数

使用密码固定的随机数生成算法是安全生成随机数的关键。这些算法会生成不可预测的随机数,攻击者无法轻易猜测。这些算法的输出对蛮力攻击具有抵抗力,并且在统计学上是强大的。
除非您知道自己在做什么,否则您不应尝试实施自己的一个。相反,始终使用已知为安全的随机库。

让我们看一些使用不同编程语言使用安全随机库的示例。

JavaScript

Math.random()函数不适合加密目的,因为它不是真正的随机性,可以被攻击者预测或操纵。

要在JavaScript中生成一个安全的随机数,您可以使用koude2Crypto.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上阅读更多信息。