替代md5,也可以在javascript中使用

时间:2012-11-20 09:04:01

标签: php javascript encryption hash md5

正如php.net所说here

  

由于以下原因,不建议使用此功能来保护密码   这种哈希算法的快速性。

自从我开始使用PHP编程以来,我已经使用了md5函数,但在研究之后,显然不鼓励使用md5,并且应该使用替代方法。

我知道可能的替代方案sha1还有其他人吗?

这些其他优势有哪些优势,sha1(不包括更高的安全性)?

最重要的是,可以在javascript中复制sha1哈希或任何其他哈希算法吗?

我在javascript中有一个md5插件,这是我的一些安全应用程序的关键。因此,使用具有javascript插件的散列算法是绝对必要的。

2 个答案:

答案 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