【问题标题】:Does a Good Password Salt Need to Include Both Numbers and Letters?一个好的密码盐是否需要同时包含数字和字母?
【发布时间】:2024-04-14 19:25:01
【问题描述】:

我在使用加密算法对新创建的密码进行散列之前对它们进行盐渍化。我使用随机数函数生成盐。

如果您的盐仅由数字(没有字母)组成,您是否会损害安全性,或者这根本没有区别?

【问题讨论】:

标签: security passwords password-protection


【解决方案1】:

盐应该是唯一的(理想情况下适用于世界上的每个密码),并且不可预测。使用确定性计算机可以做的最好的事情是获取一个随机数,并希望返回的值几乎是唯一的。因此,您拥有的可能组合越多,盐独特的机会就越大。

一些哈希算法定义了一个数字和一个可接受字符的字母表。例如,PHP 的 BCrypt 需要一个包含 22 个字符的盐:

./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

使用字母表中的所有个字符,而不仅仅是字符 0-9,您可以获得最可能的组合。当然,带有小字母 (0-9) 的较长盐可以具有与带有大字母 (0-9,a-z,...) 的较短盐一样多的组合。

为了简短起见,请使用所有可能的字符,以及散列算法所期望的尽可能多的字符。

P.S:如果您使用 BCrypt 之类的密钥派生函数(并且您确实应该),那么您不能在散列之前对密码进行加盐,而是必须将加盐传递给散列函数。

【讨论】:

  • 我从未听说过密码哈希的不可预测性要求。关于更多=更好,在大约 64 位之后增益变得非常小,并且在大约 128 位时增加盐大小根本没有帮助。
  • @CodesInChaos - 你是对的,没有必要把盐做得很长,这就是为什么 BCrypt 只需要 22 个字符(5.4E39 组合),无论如何我稍微改变了文本。盐应该是不可预测的,否则攻击者可能会制造precalculations。一个极端的例子是从 1(用户 ID)开始增加盐分,第一个帐户是管理员帐户。
最近更新 更多