我最近一直在考虑这个问题,我想知道是否有人想过/实施任何直观的方法来保护cookie免受操纵。我总是使用“用哈希签名并稍后检查哈希”的方法,但它并没有让我觉得这是一种特别出色的方式,就像所有优秀的程序员一样,我想找到更好的方法这样做的方式。
至于为什么特别是cookie,我不使用本机会话 - 我讨厌触摸文件系统。 Cookie是一种非常快速的方式来存储数据以供日后使用,即使是用户身份验证之类的东西,我也会在cookie中查看用户ID,可能还会附带用户名/电子邮件和签名,以及随机哈希值测量
您使用哪些聪明的方法来保护您的Cookie数据?
答案 0 :(得分:2)
呃,您是将UserID存储在cookie中并根据该值为用户提供访问权限?你在找麻烦。出于安全原因,存在基于服务器会话的数据实现:将会话标识符存储在cookie中,并从客户端无法篡改它的服务器上的记录中访问UserID。
防止客户端篡改的Cookie安全性几乎是一个失败的原因。如果有足够的时间,有人会弄清楚如何破解它。不要给客户那个机会。 Cookie安全的唯一目的是确保客户的cookie不会被盗。
答案 1 :(得分:1)
使用散列,您需要非常小心,因为您已经包含了一个salt,否则确定匹配的散列可能很简单。
因此,为了防止意外事故,通常还需要加密cookie。
- 编辑
您可能还想了解“HTTPOnly”Cookie:http://www.owasp.org/index.php/HTTPOnly
答案 2 :(得分:1)
使用HMAC签名Cookie是完全合理的方法。 HMAC实际上只将您的服务器知道的密钥滚动到散列中,因此即使知道算法的人也无法生成在不知道密钥的情况下被识别为有效的HMAC。只使用普通的旧哈希是可以绕过的,因为攻击者可以生成他们自己数据的有效哈希值,并且海洋中的所有“盐”都无法解决这个问题。
即使您使用会话ID而不是存储有意义的值,您仍然必须小心,攻击者无法预测另一个有效的会话ID,而是将其发送给您,从而劫持其他用户的会话。我相信有一种针对Hotmail的实际漏洞利用方式。
加密cookie只会帮助您,如果您不希望用户看到的内容。更糟糕的是,没有HMAC的加密会产生错误的安全感,因为仅加密的cookie仍然容易受到密文的操纵而无法改变部分明文。
总而言之,不要只是散列它,使用HMAC!
答案 3 :(得分:0)
在“立即安全”播客(我忘了哪一集)中,史蒂夫·吉布森谈到做这样的事情,我认为他推荐的系统是使cookie的内容成为一个很好的哈希值,然后将该哈希值作为你的密钥本地数据库,其中值是(它)所需的所有信息。