这是在命令行生成密码的安全方法吗?

信息安全 密码
2021-08-14 21:24:11

有时我需要在 Unix 命令行工作时生成密码。我的 zshrc 中有以下别名:

alias randpass='openssl rand -base64 32 | tr -d /=+ | cut -c -30'

这些命令通过执行以下操作生成由 30 个字母数字字符组成的字符串:

  1. 使用 OpenSSL 生成 32 字节的随机数据。
  2. Base64 编码结果。
  3. 删除除大写字母、小写字母和数字之外的所有字符。
  4. 将结果截断为 30 个字符。

我能看到的唯一缺陷是删除/=+. 当然,这需要这三个符号占 base64 编码字符的三分之一以上,这是非常不可能的。

“openssl rand”的输出是否足够随机以用作密码的基础?base64 编码随机字节是否会引入任何偏差?(我假设删除/=+引入了偏差,但这非常小。)

1个回答

您可以将字节数增加到 45。然后保证不会将值截断到低于 30 个字节,因为这样至少需要一半(30 个字符)/=或者+渲染一个短于 30 个字符的字符串。

是的,它足够随机。

Base64 编码字符不会引入偏差,因为您只需将它们转换为另一种基本格式。它仍然是完全相同的数字。引入的唯一小偏差是删除/, 和+,这对应于删除字符串中的每次出现111110111111,您基本上只会在 180 位长的字符串上丢失 2 位熵,它会将随机数减少到 178 位,这仍然比 SHA1 字符串(许多密码存储为)、MD5 或 AES 128 密钥好得多。

该字符=只是填充,在 base64 字符串中没有任何有意义的值。