没有SSL的安全认证

时间:2009-08-31 05:39:36

标签: authentication web-applications ssl

我开始编写一个小型Web应用程序,并开始考虑保护登录(仅用于管理)。

如果可以的话,我会安装一个CACert或自签名的SSL证书,因为现在我将是唯一一个登录的人,但我的主人不太适应。

有没有合理的选择来保护没有SSL的网站?我一直在考虑身份验证的选项:

  1. 在JavaScript中实现salted哈希。加载登录页面时,生成salt服务器端。以明文形式发送给客户端并将其存储在会话变量中。

  2. 摘要式身份验证。我刚刚发现这个想法在浏览SO,这可能比滚动我自己的身份验证更合理。

  3. 的OpenID。这是一个开放的标准,不需要密码(我可以“劫持”我的OpenID提供商的SSL以增加登录过程的安全性),但我不知道OpenID如何工作或它有多安全。 (需要研究。例如,可以重播OpenID身份验证吗?)

  4. 所有这些的问题在于:

    • 会话可能被劫持
    • 只有登录才是安全的,其他一切都是明确的

    我可以想到在登录后保护应用程序的唯一选择是一些恶心的JavaScript和PHP来回发送加密的ASCII blob。我不想这样做。

    是否有任何加密(对于页面加载和POST)可以在我的服务器端脚本语言中实现而没有我的主机的祝福或参与,但是浏览器会支持这种加密吗?是否可以在没有SSL的情况下保护会话免受劫持(实际上)?

    在这种情况下你会做什么?

3 个答案:

答案 0 :(得分:9)

您可以安全地进行身份验证,而无需实施防范窃听。例如,您可以阻止其他人发送请求,即使他们可以读取您的请求内容。如果您需要防止窃听,我建议您去某个可以使用SSL的地方。

如果您只需要简单的身份验证而没有真正的安全性,那么您的提供程序可能会支持HTTP Basic。这(以及限制功能和备份的良好设计;)是一个合理的临时解决方案,同时您担心其他问题。

要验证您的身份,无法重播OpenID。每个验证序列都已签名。但是,OpenID本身只允许您与服务器建立身份。它不会让您签署或以其他方式验证请求。 OAuth会,但它需要传输加密部分协议。

您可以使用共享密钥对每个请求进行签名。这可以防止攻击者提交或重播请求,但窃听者仍然可以读取请求本身。请参阅Amazon AWS身份验证(包括客户端库)或flickr身份验证的文档。基本协议是:

  • 需要时间戳(可能还有一个nonce)作为请求参数
  • 规范化,排序,连接所有请求参数
  • 与URI,主持人,动词等连接
  • 使用密钥哈希
  • 使用请求
  • 在标头中发送哈希值
  • 服务器执行相同操作并比较签名

答案 1 :(得分:3)

如果您认为这是一种有趣的方式,可以使用不同的身份验证和加密方法,但最便宜和最直接的解决方案是获取可以安装SSL证书的主机。

答案 2 :(得分:1)

如果在会话中注册远程IP地址,则无法将其劫持。可以轻松检测到尝试使用具有不同IP地址的会话的人。 PHP会话默认使用它(我猜它不可选)。简单有效的解决方案。