2

正如 php.net在这里所说:

由于此散列算法的快速特性,不建议使用此功能来保护密码。

自从我开始使用 PHP 编程以来,我一直使用该md5功能,但经过研究,很明显md5不鼓励使用该功能,应该使用替代方案。

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

这些其他的有什么好处,以及sha1(不包括更高的安全性)?

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

我有一个md5javascript 插件,它是我的一些安全应用程序的关键。因此,拥有一个带有 javascript 插件的哈希算法是绝对必要的。

4

2 回答 2

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 中实现安全性。

于 2012-11-20T11:00:14.627 回答
0

是的,还有很多其他的散列算法,比SHA1. 检查SHA512,例如:它有 512 位,例如 128 位MD5。无论如何,如果您正在寻找真正的安全,您应该应用以下方法之一:

1)“固定盐”:代替md5($pass),您使用:

$salt="NaCl";
$hash=md5($salt);

2)“随机盐”:而不是md5($ pass)',您生成一个随机盐(使用函数rand($minValue, $maxValue)),范围很大(比如说rand(0, pow(10, 100))并使用md5($pass, $salt)不要忘记存储哈希和盐!

3)加密:您使用固定或随机密钥(参见前面的方法),并使用它来加密密码。我真的建议使用 Blowfish 算法。从PHP.net 上的页面:

<?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 中实现 SHA512(不生成盐)(来自CryptoJS 库):

<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/sha512.js"></s‌​cript>
<script> var hash = CryptoJS.SHA512("Message"); </script>

在 JavaScript 中实现 bcrypt:见这个例子

于 2012-11-20T10:51:56.707 回答