在Java中加密解决方案之后的HMAC

时间:2014-05-07 18:32:26

标签: java encryption aes hmac data-integrity

我想加密cookie并确保cookie没有被修改,所以我使用HMAC加密cookie。

有几种方法可以实现:

1。加密cookie上的HMAC

String encryptedCookie = AES ( cookie )
String mac = HMAC ( encryptedCookie )

- 持有值的cookie:encryptedCookie +":" + mac

2。关于加密cookie和HMAC的HMAC HMAC的sercet密钥

String encryptedCookie = AES ( cookie )
String mac = HMAC ( encryptedCookie + ":" + Hmac's secretKey )

- 持有值的cookie:encryptedCookie +":" + mac

第3。关于加密cookie和HMAC的HMAC一些不可思议的STATIC数据

String encryptedCookie = AES ( cookie )
String mac = HMAC ( encryptedCookie + ":" + java.sql.ResultSet.class.getName() )

- 持有值的cookie:encryptedCookie +":" + mac

任何人都有任何想法?哪一个更好?或者你的解决方案是什么?谢谢!

2 个答案:

答案 0 :(得分:3)

HMAC功能应该已经锁定。因此,通常HMAC显示为HMAC(K, M),其中K是密钥,M是消息。所以候选人2在这方面没有意义;这意味着在计算中将密钥K包含3次(因为密钥在HMAC本身中使用了两次)。

出于同样的原因,使用带有不可获取数据的cookie也没有意义。 HMAC的部分输入是密钥K,它已经是不可用的数据。所以你不会获得任何安全性,而且你的协议也会变得复杂。

现在AES应该用于CBC或CTR模式。 ECB加密模式不安全。这意味着您需要随机IV(CBC)或独特的IV(CTR)。此IV 成为HMAC的一部分,否则攻击者仍有可能更改解密后获得的明文。

答案 1 :(得分:0)

假设静态数据真正不可用(并且长度相同等),选项2和3实际上是相同的。如果您严重关注某人修改cookie,那么选项2更好(假设密钥未共享)它将允许您检测是否已对cookie进行了更改并且会阻止某人更改cookie然后重新运行欺骗mac的哈希。实际上,如果AES密钥不可访问且cookie中的数据具有某种语义含义,您可能会检测到对加密cookie的修改,因为它会解密为无意义的内容。但从安全角度来看,选项2可以最大程度地保证数据没有被修改。

所有这些都说明了,我对您的设置做出了许多假设,可能是也可能不是。

编辑我显然误解了关键数据的问题,并没有明确说明我的假设。 @ owlstead' s是一个更好的答案。