密码哈希(非SSL)

时间:2010-08-11 17:48:37

标签: javascript security authentication encryption

如果是非ssl传输,密码如何从浏览器发送到服务器?

我想在发送之前使用bcrypt来哈希密码+ salt ...但似乎没有bcrypt算法的javascript实现...

是md5,SHA-1足够好吗?

PS:我的网站没有存储任何用户个人信息..我只是希望用户的密码不被黑,因为用户可能在包含他/她个人信息的其他网站上使用相同的密码

6 个答案:

答案 0 :(得分:22)

说实话,你可以在前端哈希,但它不会解决你的根本问题。由于您要存储哈希以供以后验证,所以黑客需要知道的是哈希值。然后黑客可以将散列值发送给您,您的系统会将其验证为正确的值。您实际上是将未加密的密码发送到系统。

要完全有效,转移需要通过SSL加密。

实际上,解决哈希问题的简单方法就是播放man in the middle attack。由于它不使用SSL,因此使用浏览器的人无法知道HTML内容不是来自您的服务器。攻击者可以简单地将他的代码放在客户端和服务器之间,并在HTML中添加其他代码来密钥记录密码。然后发布的信息将发送给攻击者;他或她采取所需的(在这种情况下是密码),然后将信息转发到您的服务器。你和攻击者都不会知道你没有互相沟通。

这就是您必须从可验证来源购买证书的原因。他们正在验证您正在与之通信的服务器是他们所说的人。

相关:Poisoning the DNS

答案 1 :(得分:3)

你的方法似乎很不安全。但要接近你的问题......

  1. 与通过SSL发送的方式相同,只是未加密。
  2. 不,即使通过SSL,MD5还不够好。如果你真的担心安全问题,那么为什么你会选择一个可以deciphered using a multitude of web services online的破解算法(这一直是SO上几个激烈争论的焦点)。
  3. 即使您在发送密码之前对密码进行哈希处理,也可以使用此客户端。这意味着您的哈希和算法将被公开并显示给每个最终用户。因此,现在做好黑客的工作就知道你是如何发送密码的。
  4. 最后,如果您想在从客户端到服务器的传输过程中保护您的站点/文本,只需从GoDaddy获得至少20美元的SSL证书。在存储到数据库之前,在服务器端加密密码。

答案 2 :(得分:1)

也许您可以尝试实施APOP命令http://www.ietf.org/rfc/rfc1939.txt

答案 3 :(得分:1)

根据您的操作,您可以将身份验证卸载到openid。

答案 4 :(得分:0)

我总是建议人们尽可能使用SSL,但为了完整起见,应该注意 可以在没有SSL的情况下通过谨慎实施HMAC -- Hash-Based Message Authentication Code来安全地执行身份验证。

您必须确保使用加密安全哈希算法和HMAC(我建议使用SHA-224或更好),您必须记住,虽然您可以通过这种方式进行身份验证而不会泄露密钥/密码,但数据仍然必须以明文形式传输,因此不能用于信用卡交易等事项的SSL替代。

答案 5 :(得分:0)

嗯,

挑战响应协议可以在这里工作。

客户端提取登录页面
1)开始会话
2)生成会话密钥
3)发送会话密钥作为散列目标
用户登录,按提交
1)Javascript任务会话密钥SHA-1 +密码SHA-1,将结果写入密码字段
2)Javascript subimts形式
3)服务器获取会话密钥的SHA-1 + SHA-1密码哈希并比较

会话密钥使窃听者无法重播流。服务器会记住它是什么。

但是,密码的SHA1应该使用salt。简单地使用用户名可能足以防止预建的彩虹表工作。由于盐会暴露在这个协议中,你不能完全击败彩虹表。

编辑:回想起来,我没有说清楚。我正在谈论的会话ID不是PHP会话ID。它是存储在会话变量中的额外id,并以表单形式传递给客户端。它需要使用一次进行身份验证,然后从PHP会话变量中删除。同样,嗅探器可以在那之后劫持会话。

请注意,所有要求的问题都是保护嗅探器密码的一种方法。他自己的网站完全容易受到嗅闻和劫持会话的人的攻击,他知道这一点。

大胖警告:MITM攻击者可以用一些其他东西替换javascript代码,例如向他提供密码的副本。只有SSL可以防止这种攻击。