哈希散列是否更安全?

时间:2012-11-27 10:34:27

标签: php encryption passwords cryptography sha1

  

可能重复:
  Is “double hashing” a password less secure than just hashing it once?

我在PHP中使用sha1加密密码,但我想知道散列散列是否比仅散列密码更安全。

例如:

$hash = sha1($pwd);

更安全
$hash = sha1(sha1($pwd));

我不明白为什么它不会,因为反向查找网站将无法找到哈希哈希的匹配。

3 个答案:

答案 0 :(得分:2)

双重哈希并没有真正帮助。 Salting确实如此。

答案 1 :(得分:2)

为了确保您的密码存储安全,您不应使用sha1或任何其他快速哈希算法,而应使用密钥派生函数,例如 BCrypt 。< / p>

快速算法的问题是,您可以使用通用硬件(in 2012)计算每秒3 Giga sha1-hashes。这样就可以在不到一毫秒的时间内用大约500000个字来强制整个英语词典!

你的例子中的第二个问题是缺少盐。如果您不为每个密码使用唯一的salt,攻击者可以构建一个rainbow-table来获取所有密码。

BCrypt专门用于哈希密码,因此(需要一些计算时间)。通过成本因素,您可以根据未来(因此更快)的硬件调整所需的时间。在内部它做了类似于你的建议,它重复散列很多次,但是以安全的方式。

使用BCrypt可以像使用sha1哈希一样简单。 PHP 5.5将准备好自己的函数password_hash()password_verify(),以简化此任务。 PHP 5.3 / 5.4还有一个compatibility pack,可在password_compat下载。

答案 2 :(得分:-2)

首先,像sha1一样弱,它比明文存储密码更好。任何加密,散列或其他混淆都比明文好得多!

sha1的问题在于它的速度快,因此它可以快速生成哈希来破解。 Salting有很多帮助,但如果您的服务器遭到入侵,并且您的salt哈希值存储为某个字符串,那么就会有这样的优势......

如果您不想使用mcrypt或其他加密方法,可以将sha1哈希混淆如下:

$my_super_sha1_hash = 
sha1(
    sha1(
        substr(
            sha1($username)
            , 0
            , strlen($password) 
        )
    )
    .sha1(
        substr(
            sha1($password)
            , 0
            , 40-strlen($password)
        )
    )
);

通过将用户名和密码混合在一起,并使用(未知)密码的长度来确定每次在sting中使用的每个位然后再次进行哈希处理,每个盐都是唯一的但不是随机的,因此结果是所有用户都保持一致,因为必须考虑密码和用户名的字符串长度,因此很难破解。