如何使 MD5 更安全?还是真的有必要


How can I make MD5 more secure? Or is it really necessary?

我将用户名和密码存储在MySQL数据库中,并使用MD5对其进行哈希处理。但是,我只使用标准的PHP函数,没有任何修改。现在,我读到MD5坏了。你是怎么做到的?您是否通过不同的哈希机制多次运行它或添加某种形式的盐?

我很

惊讶人们如何加入"该死的,它坏了,我不会使用它!"的潮流,不要犯同样的错误。

你不能让MD5变得更好。即使使用 SHA-1 也容易受到与 MD5 相同类型的攻击。使用bcrypt将使用比MD5和SHA算法更多的CPU。

MD5被设计为快速,与SHA相同。 bcrypt不是,它允许更多的排列,这使得某人更难尝试解密原始字符串。

您需要知道为什么MD5被认为是"损坏的"。

  • 因为计算长度不超过 6 个字符的密码彩虹表的速度很快

使用今天的计算能力,可以创建一个字符数组和MD5所有排列,并将它们映射到原始字符串。这就是你得到彩虹桌的方式。如果有人下载您的数据库,然后将密码与他们的彩虹表进行比较 - 他们可以获取用户的原始密码。这很危险的原因是人们在许多事情上使用相同的密码 - 包括PayPal和其他货币处理服务。这就是为什么你使用所谓的盐。这使得获取原始字符串变得更加困难,因此对用户的密码进行加盐(假设通过反转它们并对反向输入进行 MD5 处理)将使攻击者更难将哈希恢复为原始字符串。

  • 因为碰撞

什么是碰撞?如果你给哈希函数两个不同的字符串,它返回相同的哈希 - 这就是冲突。它如何转换为用于登录的网络和哈希密码?如果 user1/password1 和 user2/password2 具有相同的哈希值,则他们可以以其他人身份登录。这就是碰撞在安全方面发挥作用的地方。

MD5

被视为已损坏的原因是,MD5 为百分比不同的字符串返回相同的哈希。而且要计算出该字符串可能是什么并不容易!从数学的角度来看 - 是的,它是"破碎的",因为如果您的字符串有 100 个字符并且它与其他字符串在 10 个字符上不同(10% 差异) - 你会得到相同的哈希值。

适用于 MD5 的内容适用于所有哈希算法。最后,它们都没有无限数量的可能哈希。但是,其中一些(如MD5)具有较少可能的哈希值并且执行速度更快。

最后,如果有人访问了您的数据库 - 您遇到的问题比使用 MD5 而不是 bcrypt 或 SHA1 更大。

向存储的每个密码添加盐,该盐不等于每个密码

只需使用MD5("yoursite.com".$string);

MD5 不可解密。破解它的唯一可能方法是通过暴力破解一切的哈希表。如果你添加一个只有你知道他们无法破解的随机字符串。

如果您担心密码安全性,那么您应该使用 SHA1()(或替代方案)而不是 MD5()。虽然 MD5 不可解密,但它可以通过彩虹表或匹配哈希来击败。

盐将适用于彩虹表,但不适用于匹配MD5实现的哈希。

有几件事你应该做。

  1. 使用 SHA 而不是 MD5。 SHA 在加密上比 MD5 更安全。 位数越多越好!
  2. 使用盐。 这使得彩虹表攻击更加困难。
  3. 通过计算哈希来增强您的密钥,如下所示:

function strenghtened_hash( $password, $salt, $n ) {
    $crypted = sha( $password . $salt );
    for( $i = 0; $i < $n; $i++ ) {
        $crypted = sha( $crypted . $password . $salt );
    }
    return $crypted;
}

现在你应该状态很好!

最好使用 bcrypt 进行密码存储,以防止彩虹表攻击,以防坏人掌握您的数据库。

至少,转储MD5(虽然计算速度很快,但如今不是很安全)并使用更安全的东西,例如带有长盐的SHA256。

切换到不同的哈希机制(您可以在人们登录时逐步执行此操作),并且绝对使用(每个用户不同)盐!

你可以使用一种叫做盐的东西。这意味着您还将此盐保存到数据库中。它是一个随机字符串,或多或少长,对于每个用户都是唯一的。

然后,要检查密码,请执行以下操作:

<?php 
     $crypted = md5($salt.$passwordFromForm);
     if($crypted == $passwordFromDB) {
         // user logged on
     }
?>
你可以

通过我写的一个名为"loop-hashing"的方法使MD5或任何哈希函数更强大,在这里阅读,加密数据的好方法,,使用循环"for"或"while"用随机生成的密钥号加密密码很多次,真的很强,很容易,所以不会再被饼干吓到, 目前没有人可以使用可用的数据库破解加密的"循环哈希"。