【发布时间】:2011-05-13 13:19:59
【问题描述】:
这看起来像是与密码一起使用的安全盐吗?有任何改进或建议或明显的缺陷吗?
$salt = '';
for ($i = 0; $i < 50; $i++) {
$salt .= chr(rand(33, 126));
}
【问题讨论】:
-
你必须知道盐!这不仅仅是单向哈希,它是一次性哈希!这是没用的。
这看起来像是与密码一起使用的安全盐吗?有任何改进或建议或明显的缺陷吗?
$salt = '';
for ($i = 0; $i < 50; $i++) {
$salt .= chr(rand(33, 126));
}
【问题讨论】:
我会使用mt_rand,因为它更快,但这对于盐来说绝对足够了。
【讨论】:
我不认为rand 是一个好的 PRNG。如果我没记错的话,它直接映射到 c PRNG,在许多实现中,它的内部状态非常小(比如 32 位)。
而且它也没有很好地播种。但是由于盐的最重要作用是防止预先计算的彩虹表,这段代码就是这样做的,它应该就足够了。
我通常将我的盐分成两部分:
这样攻击者只能访问数据库而不能访问配置文件(如果攻击使用 SQL 注入,很可能是这种情况),那么他仍然无法破解密码。
【讨论】:
长度是使盐安全的主要因素。随机性并不是非常重要,只要它对每个用户都不同。无论如何,您最终都会以纯文本形式存储它,以便您可以在散列期间使用它。
【讨论】:
您不需要将盐做得很长,而且它们的加密安全并不重要。盐的目的只是让彩虹表攻击更难,因为你不再有密码和哈希之间的一对一映射。 (他们还让目光迷离的管理员无法在数据库中看到 482c811da5d5b4bc6d497ffa98491e38 并知道 Joe 的密码是“password123”。)
即使是 4 字节的盐也绰绰有余,因为您现在有 232 ≈任何密码都有 40 亿个潜在哈希值。
【讨论】: