AES 密钥包装(使用 JSON Web 加密)有什么意义?

信息安全 密码学 AES
2021-09-07 09:34:22

我正在查看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 密钥包装是否会产生更高的安全性,如果是,为什么?如果不是,您为什么要使用它而不是直接内容加密?

4个回答

如果您需要存储大量数据,将密钥包装在加密层中的优势意味着,如果您以后需要更改密钥,则不必重新加密所有数据。您只需更改 KEK(密钥加密密钥)并重新加密 CEK,而无需再次传输所有密文。

例如,假设您使用 JSON 将数据传输到服务器以进行安全存储。您可以使用 A256KW 传输所有这些数据,而另一端的服务器只需存储这些数据。

也就是说,以下内容被传输然后存储在服务器端:

Encrypted key (CEK):  66xZoxFI18zfvLMO6WU1zzqqX1tT8xu_qZzMQyPcfVuajPNkOJUXQA   
                 IV:  X5ZL8yaOektXmfny                                         
         Ciphertext:  brz-Lg                                                   
 Authentication Tag:  xG-EvM-9hrw0XRiuRW7HrA       

如果您需要更改密钥,您只需将 CEK 拉到客户端,使用旧 KEK 解密并使用新密钥加密 CEK,然后将其发送回服务器以更新所有相关记录。

仅出于短期传输目的,这并不重要,对于较小的有效载荷使用 Direct 会更容易。

KW 允许您建立长期机密,但仍为每条消息使用不同的 CEK,这对某些用例很重要,但不是全部。

在使用 JWE 向具有不同长期密钥的多个收件人发送单个消息的情况下,这是必不可少的,因为您需要为每个收件人多次包装 CEK。

JWE 支持许多高级用例,但常见的用途是使用直接加密两方之间的 JWT。

当我们开发 JWE 时,有些人希望只支持 KW 选项并放弃直接优化。归根结底,我们根据用例得出了两种选择。直接创建更小的令牌并且更容易实现。如果您不需要 KW,请不要出汗。

使用 AES 密钥包装是有原因的。一旦你加密了一些东西,密钥就是薄弱的部分。所有获取数据的尝试都需要知道密钥。由于密钥和加密/解密软件未加密,攻击者可以窃取您的密钥并使用它。这就是密钥包装的重点,它有助于保护您的密钥。

密钥包装的使用是创建一个一次性会话密钥,该密钥生成一个随机种子并加密用于加密消息内容的公钥,另一方面将通过使用会话密钥解包公钥来解密使用他的私钥解密消息。