正如php.net所说here:
由于以下原因,不建议使用此功能来保护密码 这种哈希算法的快速性。
自从我开始使用PHP编程以来,我已经使用了md5
函数,但在研究之后,显然不鼓励使用md5
,并且应该使用替代方法。
我知道可能的替代方案sha1
。 还有其他人吗?
这些其他优势有哪些优势,sha1
(不包括更高的安全性)?
最重要的是,可以在javascript中复制sha1
哈希或任何其他哈希算法吗?
我在javascript中有一个md5
插件,这是我的一些安全应用程序的关键。因此,使用具有javascript插件的散列算法是绝对必要的。
答案 0 :(得分:3)
SHA1和MD5几乎有相同的弱点:它们的碰撞阻力被打破了。所以当MD5错误时,SHA1也是如此。他们的输出也有点短。如果需要抗冲击性,我建议至少256位哈希值。很少需要超过256位。
对于普通的散列应用程序,SHA-256(SHA-2系列的一部分)是一个不错的选择。虽然它的性能不是很好,但到目前为止还没有人打破它的碰撞阻力。您也可以使用SHA-3-256,但库支持还不是很好。
对于密码哈希,您需要专门的构造,例如scrypt,bcrypt或PBKDF2。使用唯一的盐和足够的迭代计数。不要使用普通哈希,它们太快了。
对于MAC(消息认证),使用专门的结构,例如HMAC-SHA-256而不是普通的SHA-256。
即将到来的WebCryptoAPI将包含大多数这些操作的功能。
在部署之前,您可以使用提供PBKDF2和SHA-256的crypto-js。
但我对你的架构有点怀疑。在javascript中散列密码很少是正确的选择。标准程序使用SSL / TLS并通过它发送明文密码。除非使用TLS,否则无法使用浏览器javascript实现安全性。
答案 1 :(得分:0)
是的,还有许多其他哈希算法,比SHA1
强得多。例如,检查SHA512
:它具有512位,例如,MD5
的128位。
无论如何,如果您正在寻找真正的安全,您应该应用以下其中一项:
1)“固定盐”:代替md5($pass)
,使用:
$salt="NaCl";
$hash=md5($salt);
2)“随机盐”:代替md5($ pass)',你生成一个范围很大的随机盐(使用函数rand($minValue, $maxValue)
)(比如rand(0, pow(10, 100))
并使用{{1不要忘记存储哈希和盐!
3)加密:您使用固定密钥或随机密钥(请参阅先例方法),并使用它来加密密码。我真的建议使用Blowfish算法。 来自PHP.net上的page:
md5($pass, $salt)
在JavaScript中实现SHA512(不生成salt)(来自the CryptoJS library):
<?php
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = "This is a very secret key";
$text = "Meet me at 11 o'clock behind the monument.";
echo strlen($text) . "\n";
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, $iv);
echo strlen($crypttext) . "\n";
?>
在JavaScript中实施bcrypt:请参阅this example。