2010-11-21 38 views
5

这看起来像一个安全的盐与密码一起使用吗?任何改进或建议或明显的缺陷?这看起来像是一个密码的强盐

$salt = ''; 
for ($i = 0; $i < 50; $i++) { 
    $salt .= chr(rand(33, 126)); 
} 
+0

你必须知道盐!这不仅仅是单向哈希,它是一次哈希!这是没用的。 – aliqandil 2014-04-03 03:27:11

回答

8

您不需要使盐时间很长,并且加密安全并不重要。盐的重点在于简化彩虹表攻击,因为密码和哈希之间不再有1对1的映射关系。 (他们也跟上目光流连管理员从数据库中看到482c811da5d5b4bc6d497ffa98491e38然后知道乔的密码是“password123”。)

即使是一个4字节的盐就绰绰有余了,你现在就得2 &约;任何密码都有40亿个潜在的哈希值。

+0

值得指出的是,那些具有相同密码的40亿_different_哈希依赖于散列算法的适当选择。 – 2010-11-21 22:57:41

+0

管理员不能访问源代码吗?他不能只将纯文本记录到文件中吗? – rook 2010-11-21 23:40:21

+0

@Graham Lee,我正在使用SHA512。 – sami 2010-11-21 23:40:49

3

我会用mt_rand因为它更快,但这是绝对盐足够。

5

我不认为rand是一个很好的PRNG。如果我记得正确的话,它直接映射到c PRNG,在许多实现中它有一个可怕的小(如32位)内部状态。

它也不是很好的种子。但是由于盐的最重要的作用是防止预先计算的彩虹表,这个代码所做的就应该足够了。

我通常分割我的两个部分盐:

  1. 甲每人用户部分随机其被存储在数据库中沿着散列
  2. 其被存储在配置文件中的每个应用程序的盐。

这样一个攻击者只能访问数据库而不能访问配置文件(如果攻击使用SQL注入,很可能出现这种情况),他仍然无法破解密码。

3

长度是主要使盐安全。随机性并不是非常重要,只要它对每个用户都不同。反正你最终会以纯文本的方式存储它,所以你可以在散列时使用它。

相关问题