这是我用来散列字符串的示例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;
?>
有任何想法或建议吗?
答案 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/
答案 2 :(得分:1)
我不能告诉你你的方法是否合适,因为我不是数学家。
但是,我可以说你并不真正了解密码哈希在实践中是如何运作的。
反复散列字符串不一定会使它更“安全”。根据最佳实践(使用crypt()
和BLOWFISH)做正确的事情,你会没事的。走出你自己的“最佳”路径,你很可能会被烧毁......不知何故。
依靠最佳实践是有原因的。除非涉及到天才(不,真正的天才),否则“改进”将不会有益,并且你必须理解它才能真正改进它。
答案 3 :(得分:0)
每次散列时,实际上都会增加collisions的可能性并使用增加的CPU资源而不会实际提高安全性。只需加盐,sha1
它,并称之为一天。