我需要能够将敏感数据存储在 .NET 5.0 应用程序的 appsettings.json 配置文件中。我一直在对 .NET Framework 应用程序的配置文件使用 RSA 加密,但我正在转向 .NET 5.0 应用程序开发,并且我想要一种比旧的 reg_iis.exe 方法更简单的存储/访问机密的方法。
我尝试了一种方法,并且非常接近让它发挥作用,但也许有更好的方法。我的做法:
$SecureString = Read-Host "Enter the String to Encrypt" -AsSecureString
$EncryptedString = ConvertFrom-SecureString -SecureString $SecureString
$EncryptedString
public static string Decrypt(this string str)
{
int length = str.Length / 2;
byte[] encryptedData = new byte[length];
for (int index = 0; index < length; ++index)
{
encryptedData[index] = byte.Parse(str.Substring(2 * index, 2), NumberStyles.HexNumber, CultureInfo.InvariantCulture);
}
// Decrypt the byte array to Unicode byte array
byte[] data = ProtectedData.Unprotect(encryptedData, null, DataProtectionScope.CurrentUser);
// Convert Unicode byte array to string
return Encoding.Unicode.GetString(data);
}
System.Security.Cryptography.ProtectedData
类。 .NET 5.0 显然不支持开箱即用,它是一个可以通过 NuGet 包含的平台扩展。我已经这样做了,正如我所说,如果它直接在应用程序中,它就可以工作,但作为类库的一部分,它就不行...如果我在应用程序中包含类库程序集引用,则类库构建得很好,但有一个例外:System.IO.FileNotFoundException:“无法加载文件或程序集“System.Security.Cryptography.ProtectedData,版本= 6.0.0.0,文化=中性,PublicKeyToken = b03f5f7f11d50a3a”。系统找不到指定的文件。'
它没有将 ProtectedData .dll 部署到消费应用程序,我认为它应该......
那么,我这样做本质上是错误的,还是我已经接近了?
您遇到了缺少程序集的错误,因为您直接引用编译的库。构建系统不知道其依赖项(即 ProtectedData.dll),因此在构建应用程序时它不会将它们包含在输出文件夹中。
当您将库作为项目引用时,构建系统可以通过读取项目文件来找出库所依赖的所有内容,并将这些依赖项包含在输出文件夹中。
如果出于某种原因确实需要直接引用 DLL,则需要将其依赖项(通常是构建它的整个输出文件夹)复制到应用程序的目录中。
将其作为项目引用要容易得多,除非有一些限制阻止它。如果不可能,将其作为 NuGet 包进行部署和引用是一种替代方案,它将确保您自动获取所有依赖项,但这会带来其自身的复杂性。
关于您尝试使用应用程序设置执行的操作,这是行不通的。
您调用的方法会传递给 winapi
CryptProtectData
和 CryptUnprotectData
方法。他们使用从您的登录凭据派生的密钥,因此一台计算机上加密的数据不可能被另一台计算机(甚至同一台计算机上的另一个用户)解密。
您可以在此处阅读有关存储敏感信息的替代方法:https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-6.0&tabs=windows
您可以查看ProtectedJson,加密算法可以通过Asp.NET数据保护API完全配置,它与ConfigurationBuilder无缝集成,并且NuGet包适用于.NET和.NET Core