我正在查看JSON Web Encryption (JWE)并且对您为什么要使用AES key wrapping感到有些困惑。
该文档甚至谈到了使用匹配的关键算法强度:
匹配强度的算法应尽可能一起使用。例如,当 AES Key Wrap 与给定的密钥大小一起使用时,建议在也使用 AES GCM 时使用相同的密钥大小。如果密钥加密和内容加密算法不同,则有效安全性由两种算法中的较弱者决定。
本质上,我想知道您为什么要使用 AES 密钥包装。
例子
因此,作为一个示例比较,使用 A256GCM 加密算法我需要一个 256 位密钥。为了简单起见,我的密钥是“secret0123456789secret0123456789”,我正在编码“测试”。
目录
使用直接(DIR)密钥算法(因此使用我的密钥作为内容密钥),我得到:
eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..Vlf_WdLm-spHbfJe.RxMPrw.5VC8Y_qSPdSubbGNGyfn6A
这分解为:
JWE Header: {"alg":"dir","enc":"A256GCM"}
Encrypted key (CEK): (blank)
IV: Vlf_WdLm-spHbfJe
Ciphertext: RxMPrw
Authentication Tag: 5VC8Y_qSPdSubbGNGyfn6A
A256KW
将密钥包装算法与加密算法相匹配,我将使用AES 256 位密钥,这会产生:
eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIn0.66xZoxFI18zfvLMO6WU1zzqqX1tT8xu_qZzMQyPcfVuajPNkOJUXQA.X5ZL8yaOektXmfny.brz-Lg.xG-EvM-9hrw0XRiuRW7HrA
这分解为:
JWE Header: {"alg":"A256KW","enc":"A256GCM"}
Encrypted key (CEK): 66xZoxFI18zfvLMO6WU1zzqqX1tT8xu_qZzMQyPcfVuajPNkOJUXQA
IV: X5ZL8yaOektXmfny
Ciphertext: brz-Lg
Authentication Tag: xG-EvM-9hrw0XRiuRW7HrA
据我了解,内容密钥是使用JSON Web Key (JWK)加密的,但本质上这是这样做的:
- 创建随机 256 位内容加密密钥 (CEK)
- 用这个 CEK(和一个随机 IV)加密实际数据
- 用我提供的密钥加密 CEK
加密的 CEK、IV 和加密数据都是生成的 JWE 对象的一部分(都是 base64url 编码的)。
直接 JWE 会导致通过网络发送更小的有效负载,我认为加密和解密都会稍微快一些,因为它跳过了一个步骤。
使用 AES 密钥包装是否会产生更高的安全性,如果是,为什么?如果不是,您为什么要使用它而不是直接内容加密?