如果是非ssl传输,密码如何从浏览器发送到服务器?
我想在发送之前使用bcrypt来哈希密码+ salt ...但似乎没有bcrypt算法的javascript实现...
是md5,SHA-1足够好吗?
PS:我的网站没有存储任何用户个人信息..我只是希望用户的密码不被黑,因为用户可能在包含他/她个人信息的其他网站上使用相同的密码
答案 0 :(得分:22)
说实话,你可以在前端哈希,但它不会解决你的根本问题。由于您要存储哈希以供以后验证,所以黑客需要知道的是哈希值。然后黑客可以将散列值发送给您,您的系统会将其验证为正确的值。您实际上是将未加密的密码发送到系统。
要完全有效,转移需要通过SSL加密。
实际上,解决哈希问题的简单方法就是播放man in the middle attack。由于它不使用SSL,因此使用浏览器的人无法知道HTML内容不是来自您的服务器。攻击者可以简单地将他的代码放在客户端和服务器之间,并在HTML中添加其他代码来密钥记录密码。然后发布的信息将发送给攻击者;他或她采取所需的(在这种情况下是密码),然后将信息转发到您的服务器。你和攻击者都不会知道你没有互相沟通。
这就是您必须从可验证来源购买证书的原因。他们正在验证您正在与之通信的服务器是他们所说的人。
答案 1 :(得分:3)
你的方法似乎很不安全。但要接近你的问题......
最后,如果您想在从客户端到服务器的传输过程中保护您的站点/文本,只需从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可以防止这种攻击。