代码之家  ›  专栏  ›  技术社区  ›  s4y

不使用SSL的安全身份验证

  •  16
  • s4y  · 技术社区  · 16 年前

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

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

    在不使用SSL的情况下,是否有任何合理的保护站点的选项?我一直在考虑身份验证的选项:

    1. 在JavaScript中实现一个盐散列。加载登录页面后,生成salt服务器端。将其发送到clear中的客户机,并将其存储在会话变量中。

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

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

    所有这些问题在于:

    • 会话可能被劫持
    • 只有登录才是安全的,其他一切都在清除状态

    我能想到的唯一一个在登录后保护应用程序的选项是一些恶心的javascript和PHP来回发送加密的ASCII块。我不想这样做。

    是否有任何加密(用于页面加载和发布)可以在我选择的服务器端脚本语言中实现,而不需要我的主机的支持或参与,但浏览器会支持这种加密?会话是否可以在没有SSL的情况下(实际上)免受劫持?

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

    3 回复  |  直到 16 年前
        1
  •  9
  •   Karl Anderson    16 年前

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

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

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

    你可以用一个共享的秘密来签署每个请求。这将阻止攻击者提交或重放请求,但窃听者仍然可以读取请求本身。请参阅有关Amazon AWS身份验证(包括客户端库)或Flickr身份验证的文档。基本协议是:

    • 需要一个时间戳(可能是一个nonce)作为请求参数
    • 规范化、排序、连接所有请求参数
    • 与uri、host、verb等连接。
    • 带密钥的哈希
    • 在带有请求的头中发送哈希
    • 服务器执行相同操作并比较签名
        2
  •  3
  •   Mike Buckbee    16 年前

    如果您将此作为一种有趣的方式来处理不同的身份验证和加密方法,这很好,但最便宜和最直接的解决方案是获得一个可以安装SSL证书的主机。

        3
  •  1
  •   Havenard    16 年前

    如果您在会话中注册了远程IP地址,它就不能被劫持。很容易检测到有人试图使用具有不同IP地址的会话。默认情况下,PHP会话使用它(我想它是不可选项的)。简单有效的解决方案。