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

时间:2011-05-13 10:32:08

标签: php security md5

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

9 个答案:

答案 0 :(得分:11)

我很惊讶人们如何加入“该死的,它已经坏了,我不会用它!”,不要做同样的错误。

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

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

你需要知道为什么MD5被认为是“破碎”。

  • 因为计算密码长度最多为6个字符的彩虹表很快。

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

  • 由于碰撞

什么是碰撞?如果你给散列函数两个不同的字符串,它返回相同的散列 - 这是一个碰撞。它如何转换为登录的Web和哈希密码?如果你对user1 / password1和user2 / password2有相同的哈希值 - 他们可以像其他人一样登录。这就是碰撞在安全方面发挥作用的地方。

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

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

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

答案 1 :(得分:6)

为每个存储的密码添加一个盐,该密码对于每个密码都不相同

答案 2 :(得分:1)

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

即可

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

答案 3 :(得分:1)

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

Salts将对Rainbow table起作用,但不会与使用MD5实现的哈希匹配。

答案 4 :(得分:1)

你应该做几件事。

  1. 使用SHA代替MD5。 SHA比MD5更加加密。越多越好!
  2. 使用盐。这使rainbow table attacks更加困难。
  3. Strengthen your key通过如下计算哈希值:
  4. function strenghtened_hash( $password, $salt, $n ) {
        $crypted = sha( $password . $salt );
        for( $i = 0; $i < $n; $i++ ) {
            $crypted = sha( $crypted . $password . $salt );
        }
        return $crypted;
    }
    

    现在你应该保持良好的状态!

答案 5 :(得分:1)

你可能最好使用using bcrypt for password storage来防止彩虹表攻击,以防坏人抓住你的数据库。

至少,转储MD5(虽然计算速度快,现在不是很安全),并使用像SHA256一样更安全的东西和长盐。

答案 6 :(得分:0)

切换到不同的哈希机制(您可以在人们登录时逐步进行)并且肯定使用(每个用户不同)盐!

答案 7 :(得分:0)

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

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

<?php 
     $crypted = md5($salt.$passwordFromForm);

     if($crypted == $passwordFromDB) {
         // user logged on
     }
?>

答案 8 :(得分:0)

您可以通过我写的“loop-hashing”方法使MD5或任何散列函数更强大,在此处阅读,Good method to encrypte data,,使用循环“for”或“while”来使用随机生成的密钥编号加密密码很多次,真的很强大且非常简单,所以不会再次破解破解者,没有人可以使用可用的数据库破解加密的“循环哈希”。 / p>