我想加密一个cookie,并确保它没有被修改,所以我使用HMAC来加密cookie。
有几种实现方法:
1.加密cookie上的HMAC
String encryptedCookie = AES ( cookie )
String mac = HMAC ( encryptedCookie )
-持久化值为: encryptedCookie + ":“+ mac的cookie
2.加密cookie上的HMAC &HMAC的服务器密钥
String encryptedCookie = AES ( cookie )
String mac = HMAC ( encryptedCookie + ":" + Hmac's secretKey )
-持久化值为: encryptedCookie + ":“+ mac的cookie
3.加密cookie上的HMAC &一些无法猜测的静态数据
String encryptedCookie = AES ( cookie )
String mac = HMAC ( encryptedCookie + ":" + java.sql.ResultSet.class.getName() )
-持久化值为: encryptedCookie + ":“+ mac的cookie
有人有什么想法吗?哪一个更好?或者你的解决方案是什么?谢谢!
发布于 2014-05-07 21:07:24
HMAC功能应该已经被键化了。因此,通常HMAC显示为HMAC(K, M)
,其中K
是键,M
是消息。因此,候选2在这方面没有意义;这意味着计算中包含了3次密钥K
(因为密钥在HMAC本身中使用了两次)。
出于同样的原因,使用带有无法猜测的数据的cookie也是没有意义的。HMAC的部分输入是关键的K
,这已经是不可猜测的数据。这样你就不会获得任何安全,你就会使你的协议复杂化。
现在应该在CBC或CTR模式下使用AES。欧洲央行的加密模式不安全。这意味着你需要一个随机IV (CBC)或一个独特的IV (CTR)。此IV应该是HMAC的一部分,否则攻击者仍有可能更改解密后获得的明文。
发布于 2014-05-07 18:36:04
选项2和3实际上是相同的,假设静态数据确实不可猜测(以及相同的长度等)。如果您严重担心有人修改cookie,那么选项2更好,因为(假设密钥不是共享的),它将允许您检测是否对cookie进行了更改,并防止某人更改cookie,然后重新运行哈希以伪造mac。实际上,如果无法访问AES密钥,并且cookie中的数据具有某种语义含义,那么您很可能能够检测到对加密cookie的修改,就像它将解密到一些没有意义的东西一样。但是,从安全的角度来看,备选方案2将提供数据没有被修改的最大保证。
所有这些,我正在对你的设置做一些假设,这些假设可能是真的,也可能不是。
编辑,我显然误解了关于关键数据的问题,并且没有清楚地说明我的假设。@owlstead是一个更好的答案。
https://stackoverflow.com/questions/23525610
复制相似问题