【问题标题】:Alternative to md5, also available in javascriptmd5 的替代品,也可用于 javascript
【发布时间】:2012-11-08 07:31:33
【问题描述】:

正如 php.net 所说的here

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

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

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

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

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

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

【问题讨论】:

  • 关于 Javascript 中的 SHA-1,请查看 php.js 项目并查看 sha1 函数。
  • @MaxArt 谢谢你的回复,会看看:-)
  • 查看 crypto-js 了解 JavaScript 哈希函数。
  • “x 可以在 y 中完成吗?”的答案总是“是”,只要 x 是可计算的并且 y 是图灵完整的;-)。最好问“x 在 y 中是否可以作为库函数使用?”
  • 我会很感兴趣,你在哪里应用 Javascript 中的哈希作为“安全的关键”。不能用纯服务器方案来保护您要保护的任何内容吗?

标签: php javascript encryption hash md5


【解决方案1】:

SHA1 和 MD5 具有几乎相同的弱点:它们的抗碰撞能力被破坏。所以当MD5错了,SHA1也错了。他们的输出也有点短。如果需要抗碰撞性,我建议至少 256 位哈希。很少需要超过 256 位。

对于普通的散列应用程序,SHA-256(SHA-2 系列的一部分)是一个不错的选择。虽然它的性能不算太好,但到目前为止还没有人打破它的抗碰撞能力。您也可以使用 SHA-3-256,但库支持还不是很好。

对于密码散列,您需要专门的构造,例如 scrypt、bcrypt 或 PBKDF2。使用唯一的盐和足够的迭代次数。不要使用普通哈希,它们太快了。

对于 MAC(消息身份验证),使用专门的结构,例如 HMAC-SHA-256 而不是普通的 SHA-256。


即将推出的WebCryptoAPI 将包含大多数这些操作的功能。

在部署之前,您可以使用crypto-js,它同时提供 PBKDF2 和 SHA-256。


但我对你的架构有点怀疑。在 javascript 中散列密码很少是正确的选择。标准程序是使用 SSL/TLS 并通过它发送明文密码。除非您使用 TLS,否则您无法在浏览器 javascript 中实现安全性。

【讨论】:

  • 请参阅我对@GiulioMuscarello 回答的评论。你已经在一定程度上回答了我的问题,所以 +1,但我真的取决于我是否可以找到一个 javascript 插件来复制 PHP 函数。
  • 加密 API 是 javascript 吗?
  • 将密码从一个页面发送到另一个页面,无论是通过 ajax 还是表单提交,都会暴露正在发送的数据,除非是通过 HTTPS。散列密码客户端,只是为应用程序增加了另一个级别的安全性(尽管很小,并且可以破解)。这就是为什么:-)
  • @BenCarey 散列 transmission 的密码客户端并没有提供任何安全性。您刚刚将密码的哈希值设为密码。可以这样想:你和我同意通过代码字“Potato”来识别彼此。有一天,您意识到有人可能会在您确定身份时听到您的声音,因此您对我说:“好吧,从现在开始,我将散列密码字并告诉您,这样我们就可以保持安全! "但是由于“Potato”总是哈希到“123456789”,是什么阻止那些无意中听到“123456789”而不知道“real”关键字是“Potato”的人重复它?
  • @NikB。我同意,但是,它增加了一层安全性,因为他们仍然不知道在表单中输入了什么
【解决方案2】:

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

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 上的page

<?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(不生成盐)(来自 the CryptoJS library):

<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:参见 this example

【讨论】:

  • 另外,解释为什么 512 优于 sha512 优于 md5 和 sha1:sha512 是 512 位长,而 md5 是 128 位,sha1 是 - afaik - 256 位。因此,使用 md5 比使用 sha512 更有可能发现冲突(具有相同哈希的两个字符串)。
  • 感谢您的回答,尽管我很感谢您的帮助,但我已经知道或加盐以及为什么 sha512 更安全等等......我不是 PHP 安全的新手。我的问题很简单,哪个是最安全的,它是否作为 javascript 插件存在?你已经在一定程度上回答了我的问题,所以我会给你+1,但我真正想要的是清楚地表明要使用哪种哈希算法(你已经这样做了),以及一个开源 javascript 插件的链接包括这个算法。如果你能提供,那么我会接受你的回答。
  • 相当多的缺陷。 1)ECB模式2)将字符串直接放入IV。 3) 用于密码散列的 MD5 4) 错误的盐创建。 5) 加密容易受到填充预言的影响(作为一个小问题,为什么没有 AES?)
  • @GiulioMuscarello 您需要修改答案,而不是添加到 cmets
猜你喜欢
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
相关资源
最近更新 更多