如何在不使用SSL/HTTPS的情况下保护会话ID和cookie?

ace*_*ace 3 security ssl https

据我所知,如果我不使用SSL/HTTPS,cookie和会话ID将通过网络传输为纯文本.一个传感器可以使用数据包嗅探器来获取这些信息.如何在不使用SSL/HTTPS的情况下保护它?我猜这个解决方案包括在客户端和服务器端做一些事情来处理这个问题.我的服务器端是Java.

irc*_*ell 8

您可以使用安全Cookie协议(PDF)之类的东西在发送之前加密Cookie.您可以使用请求的IP地址或一般100%特定于用户的其他标识符,而不是会话标识符.

因此,要设置它,您需要创建一个服务器密钥k.然后,您将创建cookie,如下所示:

keyhmac = HMAC(user name + expiration time, k)
encrypted = ENCRYPT(data, keyhmac)
hmacenc = HMAC(user name + expiration time + data + session identifier, keyhmac)
cookie = user name + expiration time + encrypted + hmacenc;
Run Code Online (Sandbox Code Playgroud)

然后,您可以稍后使用反向过程对其进行解密.HMAC验证它没有被篡改到您的服务器外(假设这k是真的秘密)......

它包含一个会话标识符(SSL最好,但IP可以服务)这一事实意味着它不受重放攻击或劫持攻击的影响.

SSL是最好的,但你可以通过使用这样的加密方案获得一个相当不错的系统.绝对最好的方法是将这个方案与SSL相结合,然后SSL可以防止各种恶意(包括MITM篡改,但不会阻止其他MITM攻击)......

  • @ircmaxell端到端传输层保护(例如SSL提供的保护)是**唯一的解决方案**.在这种情况下,您仍在传输静态值,以便客户端可以向服务器进行身份验证.没有什么能阻止窃听者获得这个价值.有一些JavaScript解决方案,但失败的原因是JavaScript代码的原始加载无法以经过身份验证的方式完成. (4认同)
  • @ircmaxell更多"安全Cookie协议"是对密码术的严重滥用,因为它更安全,更容易使用简单的加密随机数作为cookie.如果你了解有关asp.net oracle padding漏洞的消息,那么就会发现你可以在某些web应用程序上获得远程代码执行,因为这会误用加密技术."复杂性是安全的最大敌人" - 布鲁斯施奈尔 (4认同)
  • @rook,你能提供一个更好的解决方案,或至少解释这个问题有什么问题吗?当然,SSL会更好,但考虑到原始问题的参数,这个答案有什么问题? (3认同)