Java - javax.crypto.Mac 和 javax.crypto.Cipher 之间的区别?

Java - Difference between javax.crypto.Mac and javax.crypto.Cipher?

我想了解一下javax.crypto.Mac and javax.crypto.Cipher的区别。这两个 类 看起来非常相似(它们有相似的方法,但是这两个 类 并不相互继承)。

  1. 这两者之间的根本区别是什么 类?
  2. 我什么时候应该使用(或不使用)Mac?
  3. 我什么时候应该使用(或不使用)Cipher?

A Message Authentication Code是为了诚信。它根据某些输入消息计算一种 "keyed checksum" ,它取决于消息和密钥。知道密钥后,可以验证 MAC 是否匹配给定的消息。因此可以可靠地检测到更改。

一个Symmetric encryption algorithm是为了保密。它将消息转换为不可读的比特序列;如果解密密钥已知,则加密是可逆的。

MAC不保证保密;消息保持原样,清晰可读。加密并不能确保完整性;改动可能未被发现。在正确应用的密码学中,你需要两者。 (但请注意,这个 "properly" 术语很大。)