在我的应用程序中,我配置了数据保护机制以将生成的 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 。
这意味着您可以从此 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/