我有一个网站要求用户使用用户名和密码进行身份验证。我想使用SSL,但我没有SSL证书。但我还做了其他一些我认为没问题的事情。
我的网站主要是基于AJAX的,需要 JavaScript,否则什么都不会有效。
当用户尝试登录时,我使用AJAX查询数据库以查找该用户名的盐,如果没有找到,则返回随机盐(以防止人们知道是否存在具有该用户名的用户或不)。然后,使用JavaScript的MD5函数,我将密码哈希并加密密码4K次(就像Linux使用MD5进行密码哈希)客户端,然后我以明文形式将该哈希传递给服务器。然后,将对此哈希进行多次哈希处理,并使用数据库中的内容进行检查。
这样安全吗?如果没有,我怎样才能保证它的安全,而无需为现有的内部网站提供SSL证书?
答案 0 :(得分:15)
没有。这不安全。一个中间人可以窥探散列值并稍后将它呈现给你,错误地认证自己。
要认证某人,您必须证明他们知道一个秘密。通过未加密的频道传递的任何东西都不是秘密。
使用SSL。您可以获取free that are accepted by Firefox,的证书,并且可以向IE用户提供有关将新CA添加到其受信任根的说明。开箱即用Certificates that are accepted by all browsers便宜,我认为每年30美元。
答案 1 :(得分:3)
最佳选择是:
正如其他人所说,您的解决方案并不安全。与以明文形式向服务器发送密码相比,它没有任何改进。主要原因:
答案 2 :(得分:2)
您可以免费制作自己的SSL证书,一般用户不会信任它,但您可以信赖它。
通过使用JavaScript和未加密的传输层,您可以打开某人抓取您发送到服务器的哈希的可能性,更不用说给出了如何哈希密码/用户名的确切蓝图。
这实际上取决于安全性对该应用程序的重要性。如果非常重要,请删除Ajax,并获取SSL证书并使用HTTPS层。
答案 3 :(得分:1)
您的解决方案可以重播攻击。在浏览器和Web服务器之间直接尝试Digest Authentication(RFC 2617)。