密码散列这会被认为是荒谬的吗?

时间:2011-10-08 03:37:12

标签: php encryption hash md5 sha1

这是我用来散列字符串的示例PHP代码。这种方法是否具有任何额外的安全性好处,或者根本不实用?

<?php
$string = "Pickles";
$salt_1 = "8w87wv87w43j78wv43jf4wv34zv3wv43twvv";
$salt_2 = "mnd9r4ng8rnf903ng8gm6ks9rhr74ner7fu4";
$salt_3 = "4hr84h4yeu3je8u3ir94j59ti5i59it5j5i9";
$layer_1 = sha1(md5(hash($salt_1.$string.$salt_3)));
$layer_2 = sha1(md5(hash($salt_2.$layer_1.$salt_1)));
$layer_3 = sha1(md5(hash($salt_3.$layer_2.$salt_2)));
$final_result = $layer_3;
echo $final_result;
?>

有任何想法或建议吗?

4 个答案:

答案 0 :(得分:2)

不,它不是矫枉过正,是重大的附带损害。

你有几种“盐”。有很多盐是没用的,但无害。然而,你的“盐”似乎是常数 - 这是非常有害的。对于每个散列密码,salt 必须是唯一的;否则,它不是一个盐,它不是盐的工作,这是为了防止攻击者并行攻击几个密码(“并行”是时间和空间的;一个大的预计算哈希表是时间的并行)。

此外,您调用了6个哈希函数(或者可能是9个,具体取决于您的hash()函数的含义)。这太少了。 100000次调用将更接近适当的计数。多次调用是为了使密码处理 - 对于“尝试”密码的攻击者来说速度很慢,这是(不幸的是,这使得服务器的速度变慢,所以你无法提升迭代计数。)

有关详细信息,请参阅this answer。然后是this one。并使用bcrypt(在PHP there中有一个免费的bcrypt开源实现)。

答案 1 :(得分:1)

MD5和SHA1是单向哈希。您打算解密这些消息以便以后阅读吗?如果没有,这不是加密。它只是获取三次使用salt密钥加密的字符串的哈希值。这是关于发明自己的加密算法的一些合理建议:

http://diovo.com/2009/02/wrote-your-own-encryption-algorithm-duh/

https://security.stackexchange.com/questions/2202/lessons-learned-and-misconceptions-regarding-encryption-and-cryptology

Is this kind of encryption "safe"?

答案 2 :(得分:1)

我不能告诉你你的方法是否合适,因为我不是数学家。

但是,我可以说你并不真正了解密码哈希在实践中是如何运作的。

反复散列字符串不一定会使它更“安全”。根据最佳实践(使用crypt()和BLOWFISH)做正确的事情,你会没事的。走出你自己的“最佳”路径,你很可能会被烧毁......不知何故。

依靠最佳实践是有原因的。除非涉及到天才(不,真正的天才),否则“改进”将不会有益,并且你必须理解它才能真正改进它。

答案 3 :(得分:0)

每次散列时,实际上都会增加collisions的可能性并使用增加的CPU资源而不会实际提高安全性。只需加盐,sha1它,并称之为一天。