经过身份验证的额外数据

经过身份验证的额外数据 (AAD) 是您在加密或解密请求中传递给 Cloud Key Management Service 的任意字符串。AAD 用作完整性检查,可以帮助保护您的数据免受混淆代理攻击。AAD 字符串不得大于 64 KiB。

除非使用相同的 AAD 值进行加密和解密,否则 Cloud KMS 将无法解密密文。

AAD 与加密的数据绑定,因为除非您知道 AAD,否则无法解密密文,但 AAD 不会存储在密文中。AAD 也不会增加密文的加密强度。它只是 Cloud KMS 对解密请求进行身份验证的一项额外检查。

在 Cloud KMS 中,当您进行调用以执行加密或解密操作时,AAD 始终存在;如果您没有为 AAD 提供值,则使用空字符串。如果将空字符串用作明文加密的 AAD,则只能使用空字符串来解密密文。

Cloud 审核日志不会记录 AAD。

何时使用 AAD

使用 AAD 的一个示例是:应用充当封装/解封装代理,此代理具有单个密钥和不限数量的客户端,而每个客户端处于不同安全边界。例如,应用可以是日记应用,让用户可以保留私密日记。当用户需要查看私密日记条目时,应用可以在解封装(解密)请求中使用唯一用户名作为 AAD 来显式验证用户身份。在这种情况下,您可以使用单个密钥给多个用户(不限数量)提供服务。这样做的主要好处是您无需为单个用户保留状态。

另一个实例是,如果应用需要使用包含一些私密信息(例如电子邮件地址)的不记名令牌。不记名令牌的输入将是用于不记名令牌的经过身份验证的数据以及明文电子邮件地址。然后,这些输入将被加密,从而使交换的不记名令牌采用经过身份验证的额外数据 (AEAD) 的形式。

混淆代理攻击示例

此示例展示了受诱骗的应用如何代表恶意用户解密密文。在此示例中,应用是混淆代理,因为应用在不知道自己被攻击者诱骗的情况下滥用其权限。造成的结果是攻击者能够查看最初为另一个用户加密的解密数据。请注意,在这次攻击中,攻击者不需要知道加密密钥,因为它依赖于混淆代理来执行解密。

  1. 日记应用允许用户保留私密日记。每个日记条目都已加密,而且预期只能由创建日记条目的用户解密。

  2. Alice 创建了一个日记条目。应用加密该日记条目,然后将加密的日记条目存储到为属于 Alice 的日记条目预留的位置。

  3. Alice 发送请求来查看其日记条目。由于加密的日记条目位于给 Alice 预留的位置,因此应用会解密数据并将数据作为对 Alice 请求的响应返回。这是应用的预期行为。

  4. Mallory 将 Alice 的日记条目从给 Alice 预留的位置复制到给 Mallory 预留的位置。

  5. Mallory 发送请求来查看 Mallory 的 Alice 日记条目副本。 由于 Alice 的日记条目副本位于给 Mallory 预留的位置,因此应用会解密该日记条目并将明文作为对 Mallory 请求的响应返回。然后,Mallory 可以查看 Alice 的日记条目,这不是应用的预期行为。

为了防范这种攻击,应用可以使用非空字符串作为 AAD 进行加密和解密。AAD 会为解密请求提供额外检查。在 Mallory 发送解密请求以查看 Mallory 的 Alice 日记条目副本时,Mallory 的请求将不会成功,除非 Mallory 还可以诱骗应用使用正确的 AAD。

存储或重现 AAD

使用 AAD 加密之前,决定是将 AAD 与加密数据一起存储还是重现 AAD 以进行后续解密。

存储 AAD 的原因是当您需要解密密文时,可以直接使用 AAD。例如,数据库行可以同时包含密文以及加密明文时使用的 AAD。收到解密请求后,应用可以从数据库中同时检索 AAD 和密文。然后,应用可以将 AAD 用于密文解密过程。

重现 AAD 的原因是验证任何非私密数据,同时也避免存储 AAD。例如,如果您要确保加密文件的文件路径和文件名尚未更改,则可以在加密文件时添加文件路径和文件名作为 AAD。然后,在为文件发送解密请求后,您可以通过检查文件路径和文件名来重现 AAD。

存储 AAD

存储 AAD 意味着保存 AAD,让您的应用未来可以随时使用 AAD。例如,数据库表可以包含两个列:一个列用于存储密文,另一个列用于存储创建密文时使用的 AAD。在解密密文时,应用会检索 AAD 并将其用于解密。

设想一个日记应用,该日记应用旨在仅向创建日记条目的用户显示日记条目。日记条目在创建后,会进行加密,然后保存到数据库的列 ENCRYPTED_DIARY_ENTRY 中。对于要求查看日记条目的每个请求,应用会对用户进行身份验证,然后向用户提供日记条目。

假设未使用 AAD(默认空字符串除外)并假设 Mallory 能够将 Alice 的 ENCRYPTED_DIARY_ENTRY 数据复制到 Mallory 的 ENCRYPTED_DIARY_ENTRY 数据。在 Mallory 针对 Mallory 的 ENCRYPTED_DIARY_ENTRY 数据(从 Alice 的数据中复制)发送解密请求后,应用会执行解密,而不会意识到已被诱骗。Mallory 能够以明文形式查看 Alice 的日记条目。

现在我们假设加密日记条目时,用户电子邮件地址被用作 AAD。在 Alice 创建日记条目后,应用将其未加密的电子邮件地址存储在 ENCRYPTED_DIARY_ENTRY 数据旁边的 EMAIL 列中。我们再次假设 Mallory 能够将 Alice 的 ENCRYPTED_DIARY_ENTRY 数据复制到 Mallory 的 ENCRYPTED_DIARY_ENTRY 数据中。在 Mallory 发送解密请求后,应用会从 EMAIL 列检索 Mallory 的电子邮件地址,以用作解密请求的 AAD。Mallory 的电子邮件地址不会成功用作 AAD 进行解密,因此应用不允许 Mallory 以明文形式查看 Alice 的日记条目。

重现 AAD

重现 AAD 意味着它不会存储在任何地方,但您可以在需要解密时重现。

例如,您可以将文件路径和文件名用作 AAD。在加密过程中,假设加密的文件已保存到 MY_PATH\MY_FILE1.enc,因此 "MY_PATH\MY_FILE1.enc" 用作 AAD。系统不会存储此 AAD。收到解密请求后,应用可以通过检查要解密的文件的文件路径和文件名来重现 AAD。如果加密的文件尚未移到另一个位置,则 "MY_PATH\MY_FILE1.enc" 将在解密期间用作 AAD,这与加密期间使用的 AAD 相同,因此解密可以继续进行。

如果加密的文件已移动(例如移到 SOME_OTHER_PATH\MY_FILE1.enc),则"SOME_OTHER_PATH\MY_FILE1.enc" 将用作 AAD 进行解密。此 AAD 值与用于加密的 AAD 值不匹配,因此解密将失败。