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



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

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

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

我的想法是:由于$RANDOM生成一个介于 0 和 32,767 之间的随机整数,因此生成两个随机整数并将它们相乘会将搜索空间增加到 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的讨论,请参阅这篇文章:"何时使用/dev/random vs/dev/urandom"。

不,这并不合理安全。有几个问题:

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

最新更新