ASP.NET Core 中的已验证加密详细信息

对 IDataProtector.Protect 的调用是已验证的加密操作。 Protect 方法可保证机密性和真实性,它与用于从根 IDataProtectionProvider 派生此特定 IDataProtector 实例的目标链相关联。

IDataProtector.Protect 采用 byte[] 纯文本参数并生成受 byte[] 保护的有效负载,其格式如下所述。 (还有一个扩展方法重载,它采用字符串纯文本参数并返回受字符串保护的有效负载。如果使用此 API,则受保护的有效负载格式仍将采用以下结构,但它将为 base64url 编码。)

受保护有效负载的格式

受保护有效负载的格式由三个主要部分组成:

  • 标识数据保护系统版本的 32 位 magic 标头。

  • 128 位密钥 ID,标识用于保护此特定有效负载的密钥。

  • 受保护有效负载的其余部分特定于此密钥封装的加密程序。 在下面的示例中,密钥表示 AES-256-CBC + HMACSHA256 加密程序,有效负载进一步细分如下:

    • 128 位密钥修饰符。
    • 128 位初始化向量。
    • 48 字节的 AES-256-CBC 输出。
    • HMACSHA256 身份验证标记。

受保护有效负载的示例如下所示。

09 F0 C9 F0 80 9C 81 0C 19 66 19 40 95 36 53 F8
AA FF EE 57 57 2F 40 4C 3F 7F CC 9D CC D9 32 3E
84 17 99 16 EC BA 1F 4A A1 18 45 1F 2D 13 7A 28
79 6B 86 9C F8 B7 84 F9 26 31 FC B1 86 0A F1 56
61 CF 14 58 D3 51 6F CF 36 50 85 82 08 2D 3F 73
5F B0 AD 9E 1A B2 AE 13 57 90 C8 F5 7C 95 4E 6A
8A AA 06 EF 43 CA 19 62 84 7C 11 B2 C8 71 9D AA
52 19 2E 5B 4C 1E 54 F0 55 BE 88 92 12 C1 4B 5E
52 C9 74 A0

在上面的有效负载格式中,前 32 位或 4 个字节是标识版本的 magic 标头 (09 F0 C9 F0)

接下来的 128 位或 16 个字节是密钥标识符 (80 9C 81 0C 19 66 19 40 95 36 53 F8 AA FF EE 57)

其余部分包含有效负载,并且特定于所用格式。

警告

受给定密钥保护的所有有效负载都将以相同的 20 字节(magic 值、密钥 ID)标头开头。 管理员可以利用这一事实进行诊断,以粗略估计有效负载的生成时间。 例如,上述有效负载对应于键 {aaaaaaaa-0b0b-1c1c-2d2d-33333333333}。 如果在检查密钥存储库后,发现此特定密钥的激活日期为 2015-01-01,到期日期为 2015-03-01,那么就可以合理地假设有效负载(如果未篡改)是在该时间窗口内生成的,并且两端都有一个小的容差系数。