2

我对在不使用 SSL 的情况下保护 PHP 会话的主题感兴趣。

令我惊讶的是,如果中间人嗅探用户和服务器之间交换的数据包,即使会话经过身份验证,也很容易窃取会话。我知道有一些策略可以限制损害,例如在登录/注销时更改 sessionid,记录/检查用户系统参数(例如操作系统、浏览器)。

但是,如果在已经过身份验证且未注销的会话期间(也没有时间超时),攻击者能够获取会话 ID,那么他可以轻松劫持会话(据我了解问题)。

我想到了一个可能的解决方案,在加密的登录身份验证期间,服务器可以向客户端发送一个随机会话密码。会话密码仅在该登录会话期间有效。因此,在该会话期间交换的每条消息都必须使用会话密码(例如 MD5(会话密码+消息内容))进行签名。

问题解决了吗?假设攻击者无法对初始登录交换进行密码分析,这种方法的弱点是什么?

4

2 回答 2

3

您提出的“签名”解决方案需要客户端行为 - 因此您需要一个可以进行签名的客户端应用程序。

如果您正在编写 Flash/Java 小程序/Unity 或任何这些插件,那么您可以按照您的计划进行,因为您可以更密切地控制客户端并添加例程来进行签名。

但是我假设您在不使用插件的情况下将 HTML 页面传递给浏览器?如果是这样,你有两个选择,真的。拳头是 SSL(您正在排除),因为它内置在浏览器中。第二个是Javascript。为了获得最大的安全性,您需要以某种方式模仿 SSL,包括客户端存储加密(公共)密钥/算法(这样它们就不会与消息一起传播)。您希望尽可能接近 SSL 的公钥/私钥 + 握手 - 这绝非易事。正如 sarnold 所建议的,您需要一个强大的加密密钥。查看http://www.jcryption.org/以获取示例 - 其他人使用谷歌搜索出现。

如果这有点过分,您最可行的解决方案可能会使用 JS 协商一个更简单的加密算法:您发送一个“密钥”,将“密钥”存储在浏览器上的 cookie 中,所有通信都通过 AJAX 并创建一个基于该密钥的更简单的签名机制(可能加上客户端在初始握手期间与您共享的另一个变量)。任何不解码或不匹配密钥的内容,然后终止整个会话并重新开始。


sarnold 在他的回答中提出了要避免使用 md5 和 SHA-1 的优点;有些人甚至认为 SHA256 在当今的计算机上越来越受欢迎,但考虑到您需要在 JS 中实现解决方案,为了提高速度,您可能会与 md5 之类的“平淡无奇”(我的比喻)联系在一起。因此,您对此的最佳防御是准确的日志记录和蛮力/错误检测。任何到达时出现乱码的消息(您可以在任一端检查)都应该被记录和监控。失败太多,IP 地址被禁止 - 并继续记录。

于 2012-06-06T02:34:10.330 回答
2

您会想使用HMAC之类的东西而不是更简单的 MD5 ——并且您会想使用 SHA256 或更大,因为众所周知 MD5 有弱点,而 SHA-1 也开始变得虚弱。

但是即使进行了这些更改,您的方案仍然容易受到重放攻击,攻击者可以一遍又一遍地重新发送请求,而您的服务器每次都会很高兴地重新执行它。如果它只是发布最近一次海滩旅行的照片,这没什么大不了的,但如果它发送 1000 美元小马的购买请求,那么有人会得到比他们预期的更多的小马。

所以你需要在协议中添加一个随机数

可能还会出现其他问题——毕竟,经过 SSL 的 3 次迭代,TLS 现在是 1.2 版。坚持使用 TLS 并感到高兴。

于 2012-06-06T02:16:26.570 回答