我将用户名和密码存储在MySQL数据库中,并使用MD5进行哈希处理。但是,我只是使用标准的PHP函数而没有任何修改。现在,我读到MD5坏了。你好吗?你是通过不同的哈希机制运行它几次还是添加某种形式的盐?
答案 0 :(得分:11)
我很惊讶人们如何加入“该死的,它已经坏了,我不会用它!”,不要做同样的错误。
你不能让MD5变得更好。即使使用SHA-1也容易受到与MD5相同类型的攻击。 使用bcrypt将比MD5和SHA算法使用更多的CPU。
MD5设计为快速,与SHA相同。 bcrypt不是,它允许更多的排列,这使得某人更难以尝试解密原始字符串。
你需要知道为什么MD5被认为是“破碎”。
使用今天的计算能力,可以创建一个字符数组和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)
你应该做几件事。
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>