0

我有一个网站,要求用户使用用户名和密码对自己进行身份验证。我想使用 SSL,但我没有 SSL 证书。但我会做一些我认为还可以的事情。

我的网站主要基于 AJAX 并且需要JavaScript,否则将无法正常工作。

当用户尝试登录时,我使用 AJAX 查询数据库以查找该用户名的盐,如果没有找到随机盐(以防止人们知道是否存在具有该用户名的用户) . 然后,使用 JavaScript 的 MD5 函数,我在客户端对密码进行 4K 次哈希和加盐(就像 Linux 在使用 MD5 进行密码哈希时所做的那样)客户端,然后我将该哈希以纯文本形式传递给服务器。然后,这个哈希值会再被哈希几次,并与数据库中的内容进行检查。

这安全吗?如果没有,我怎样才能在不为大部分内部网站的 SSL 证书支付现金的情况下保护它?

4

4 回答 4

15

不,它不安全。中间人可以窥探散列值并稍后将其呈现给您,从而错误地验证了自己。

要对某人进行身份验证,您必须证明他们知道一个秘密。通过未加密通道传递的任何内容都不是秘密。

使用 SSL。您可以免费获得 Firefox 接受的证书,并且可以向 IE 用户提供有关将新 CA 添加到其受信任根的说明。开箱即用的所有浏览器都接受的证书很便宜,我认为每年 30 美元。

于 2009-06-17T18:29:03.560 回答
3

最好的选择是:

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

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

  • 从客户端以明文形式发送并直接用于身份验证的任何内容都容易受到中间人攻击和窃听攻击。在您建议的解决方案中,如果您知道散列密码,则可以登录。将密码作为散列发送没有区别。
  • 鉴权后,数据仍然是明文发送的,所以很容易被嗅探。
  • MD5全是洞
于 2009-06-17T18:34:30.493 回答
2

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

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

这实际上取决于该应用程序的安全性有多重要。如果非常重要,请放弃 Ajax,并选择 SSL 证书并使用 HTTPS 层。

于 2009-06-17T18:33:08.390 回答
1

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

于 2009-06-17T19:03:52.023 回答