bash 生成没有特殊字符的安全密码

bash generate secure password with no special characters

我每天都有一个 bash 过程,需要每天使用新密码。

为了避免处理特殊字符,我使用两个 $RANDOM 变量的乘积的 MD5 生成密码:

md5sum <<< $(($RANDOM * $RANDOM))

我的想法是:由于$RANDOM生成一个介于0和32,767之间的随机整数,然后生成两个随机整数并将它们相乘将搜索space增加到32,767^2 = 1,071,711,169

我不是安全专家,所以我很好奇我的方法是否相当安全,如果不是,有什么更好的方法?

生成任意长度(例如 20 个字符)且仅包含字母数字字符的密码的安全方法是:

cat /dev/random | tr -dc '[:alnum:]' | head -c 20

如果 /dev/random 对您来说太慢了,下面的速度很快并且可能已经足够好了:

cat /dev/urandom | tr -dc '[:alnum:]' | head -c 20

这比 md5sum 有优势,因为 (a) 它使用所有字母字符,而不仅仅是 a-f,并且 (b) 它生成大写和小写。

有关安全性和 urandomrandom 的讨论,请参阅此 post:"When to use /dev/random vs /dev/urandom"

不,这不太安全。有几个问题:

  • Bash 使用简单的线性随机数生成器,因此它不是强随机的
  • Bash 使用一天中的时间和 pid 为该生成器提供种子,因此如果您大致知道密码生成的时间(即使只是年份),您已经大大减少了搜索 space .
  • 将 0..n 中的两个数字相乘不会给出 n^2 种可能性,因为 1*16 = 2*8 = 4*4 = 8 * 2 = 16*1。一个快速程序显示,对于两个数字 0..32768,您有 232,483,839 种可能的产品。
  • 即使您修复了该问题并确实获得了 1,071,711,169 种可能性,这也只相当于 5 个字母数字字符,如果有人知道您的密码生成方案,则可以很快破解。