传递密码是否可以接受?

时间:2009-06-17 18:26:45

标签: ssl md5 security

我有一个网站要求用户使用用户名和密码进行身份验证。我想使用SSL,但我没有SSL证书。但我还做了其他一些我认为没问题的事情。

我的网站主要是基于AJAX的,需要 JavaScript,否则什么都不会有效。

当用户尝试登录时,我使用AJAX查询数据库以查找该用户名的盐,如果没有找到,则返回随机盐(以防止人们知道是否存在具有该用户名的用户或不)。然后,使用JavaScript的MD5函数,我将密码哈希并加密密码4K次(就像Linux使用MD5进行密码哈希)客户端,然后我以明文形式将该哈希传递给服务器。然后,将对此哈希进行多次哈希处理,并使用数据库中的内容进行检查。

这样安全吗?如果没有,我怎样才能保证它的安全,而无需为现有的内部网站提供SSL证书?

4 个答案:

答案 0 :(得分:15)

没有。这不安全。一个中间人可以窥探散列值并稍后将它呈现给你,错误地认证自己。

要认证某人,您必须证明他们知道一个秘密。通过未加密的频道传递的任何东西都不是秘密。

使用SSL。您可以获取free that are accepted by Firefox,的证书,并且可以向IE用户提供有关将新CA添加到其受信任根的说明。开箱即用Certificates that are accepted by all browsers便宜,我认为每年30美元。

答案 1 :(得分:3)

最佳选择是:

  • 使用由StartCom签名的证书(免费)。最新版本的Firefox和Safari支持原生。拥有IE的用户可以将CA添加到他们的可信根列表中。
  • 使用自签名证书并将其分发给您的用户,以便在其浏览器中添加。

正如其他人所说,您的解决方案并不安全。与以明文形式向服务器发送密码相比,它没有任何改进。主要原因:

  • 客户端以明文形式发送并直接用于身份验证的任何内容都容易受到中间人和窃听攻击。在您建议的解决方案中,如果您知道哈希密码,则可以登录。将密码作为哈希发送没有区别。
  • 经过身份验证后,数据仍然以纯文本格式发送,因此很容易闻到。
  • MD5 is full of holes

答案 2 :(得分:2)

您可以免费制作自己的SSL证书,一般用户不会信任它,但您可以信赖它。

通过使用JavaScript和未加密的传输层,您可以打开某人抓取您发送到服务器的哈希的可能性,更不用说给出了如何哈希密码/用户名的确切蓝图。

这实际上取决于安全性对该应用程序的重要性。如果非常重要,请删除Ajax,并获取SSL证书并使用HTTPS层。

答案 3 :(得分:1)

您的解决方案可以重播攻击。在浏览器和Web服务器之间直接尝试Digest Authentication(RFC 2617)。