asp.net-core - ASP.NET Core - 数据保护

标签 asp.net-core cryptography aes encryption-symmetric data-protection

在我的应用程序中,我配置了数据保护机制以将生成的 key 存储在我的系统上的文件中:

services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo(@"C:\keys"));

而且它正在工作。在我的“keys”目录中生成了一个文件,其内容如下:

<?xml version="1.0" encoding="utf-8"?>
<key id="7139a96c-1d75-468f-a343-1d0d363650a7" version="1">
  <creationDate>2019-04-22T14:27:34.9530001Z</creationDate>
  <activationDate>2019-04-22T14:27:34.9359888Z</activationDate>
  <expirationDate>2019-07-21T14:27:34.9359888Z</expirationDate>
  <descriptor deserializerType="Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
    <descriptor>
      <encryption algorithm="AES_256_CBC" />
      <validation algorithm="HMACSHA256" />
      <masterKey p4:requiresEncryption="true" xmlns:p4="http://schemas.asp.net/2015/03/dataProtection">
        <!-- Warning: the key below is in an unencrypted form. -->
        <value>JzykGRqFcYWq3MPQAyuXe4IlEGrj62ghnCEMMuv0YzRKmHjzlfSOcbnk7+cJpDGe0PLKfCwcNPfOKplqu1xfDg==</value>
      </masterKey>
    </descriptor>
  </descriptor>
</key>

现在我不明白一件事。我使用的是 AES_256_CBC 算法,但 key 的长度是 88 个字符而不是 32 个字符。

所以我发现 key 是使用 base64 编码的。解码后我们得到以下 key :

"'<¤qªÜÐ+{% jãëh!! 2ëôc4Jxóôq¹äïç ¤1ÐòÊ|,4÷Î*j»_ "

但它有 66 个字符而不是 32 个。如何获取 32 位 AES 对称 key ,因为我不明白 ASP.NET Core 如何保存此 key 。

我将非常感谢任何帮助。

最佳答案

key 环中的“masterKey”值实际上似乎是一个 64 字节 key 派生 key (KDK),而不是简单的 base64 AES key 。

https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/implementation/subkeyderivation?view=aspnetcore-2.2

这意味着您可以从此 KDK 派生 AES 子 key 。默认ManagedAuthenticatedEncryptor.cs就是这样的实现就可以了。

如果我能找到或编写一个独立的 key 提取器函数,我会将其添加到此处(除非有人抢先)。

希望有帮助!

编辑1:

经过五天的工作,我已经能够将 AspNetCore codebase 的各个部分拼凑在一起。进入this monstrosity 。如果您可以获得正确的 AAD 值,这将从 KDK 中提取 AES 和 SHA256 key ,然后解密 ASPNetCore 共享 cookie 负载。

关于asp.net-core - ASP.NET Core - 数据保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55796400/

相关文章:

asp.net-web-api2 - asp.net 5 和 IdentityServer4

c# - AspNet.Core,IdentityServer 4 : Unauthorized (401) during websocket handshake with SignalR 1. 0 使用 JWT 不记名 token

C#加密解密IV题

python - AES使用相同的 key 和iv重复加密相同的明文得到不同的结果

iphone - iOS 上的 AES-256 加密不会产生与 openssl 相同的结果

asp.net-core - 需要 dotnet core 2.1 才能显示在 Visual Studio 中

azure - SignalR 协商预检请求失败

c# - 为什么当文件变大时我的内存就会耗尽?

java - 从 ECDSA 签名中放置和提取文本

Ruby AES CBC 解密的 Java 等效项