5

可能重复:
“双重哈希”密码是否比仅哈希一次更安全?

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

例如:

$hash = sha1($pwd);

安全性低于

$hash = sha1(sha1($pwd));

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

4

3 回答 3

2

双重哈希并没有真正帮助。盐腌可以。

于 2012-11-27T10:37:09.450 回答
2

为了使您的密码存储安全,您不应使用sha1或任何其他快速哈希算法,而应使用BCrypt 之类的密钥派生函数

快速算法的问题在于,您可以使用普通硬件( 2012 年)每秒计算 3 Giga sha1-hashes 。这使得在不到一毫秒的时间内暴力破解大约 500000 个单词的整个英语词典成为可能!

您示例中的第二个问题是缺少盐。如果您不为每个密码使用唯一的盐,攻击者可以构建一个彩虹表来获取所有密码。

BCrypt 专门设计用于散列密码,因此速度很慢(需要一些计算时间)。通过成本因素,您可以将所需的时间调整到未来(因此更快)的硬件上。在内部,它会按照您的建议执行类似的操作,它会重复散列很多次,但以安全的方式进行。

使用 BCrypt 就像使用 sha1 哈希一样简单。PHP 5.5 将拥有自己的功能password_hash()password_verify()准备就绪,以简化此任务。还有一个适用于 PHP 5.3/5.4 的兼容包,可在password_compat下载。

于 2012-11-27T14:14:42.487 回答
-1

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

sha1 的问题在于它的速度很快,因此它可以快速生成要破解的哈希值。加盐有很大帮助,但是如果您的服务器受到损害并且您将盐哈希存储为某个字符串,那么就会有这个优势......

如果您不想使用 mcrypt 或其他加密方法,您可以像这样混合您的 sha1 哈希:

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

通过将用户名和密码混合在一起,并使用(未知)密码的长度来确定每个密码的哪些位在刺痛中使用,然后再次进行散列,每个盐都是唯一的但不是随机的,因此结果是一致的用户和很多更难破解,因为必须考虑密码和用户名的字符串长度。

于 2012-11-27T11:12:21.133 回答