如何正确存储和访问.NET 5.0 appsettings.json文件中的加密值



我需要能够将敏感数据存储在适用于.NET 5.0应用程序的appsettings.json配置文件中。我一直在为.NET Framework应用程序使用配置文件的RSA加密,但我正在转向.NET 5.0应用程序开发,我想要一种比旧的reg_iis.exe方法更简单的存储/访问机密的方法。

我尝试过一种方法,并危险地接近于让它发挥作用,但也许还有更好的方法。我的方法:

  1. 在我的appsettings.json文件中设置加密值。这些ecrypted值是通过以下PowerShell脚本生成的,然后复制到.json文件中:
$SecureString = Read-Host "Enter the String to Encrypt" -AsSecureString
$EncryptedString = ConvertFrom-SecureString -SecureString $SecureString
$EncryptedString
  1. .NET 5.0应用程序中用于解密字符串的扩展方法:
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);
}
  1. 如果这个扩展方法在应用程序中,它就可以工作,但我在许多应用程序中都需要它。所以我把它构建到类库中,这样我就可以为每个应用程序添加一个.dll引用。问题是它依赖于System.Security.Cryptography.ProtectedData类。这显然不是.NET 5.0开箱即用的支持,相反,它是一个可以通过NuGet包含的平台扩展。我已经这样做了,正如我所说,如果它直接在应用程序中,它是有效的,但作为类库的一部分,它不。。。如果在应用程序中包含类库程序集引用,则类库构建良好,但有一个例外:

System.IO.FileNotFoundException:"无法加载文件或程序集"System.Security.Cryptography.ProtectedData,Version=6.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"。系统找不到指定的文件。'

它没有将ProtectedData.dll部署到消费应用程序,我认为它应该是…

那么,我这样做本质上是错的,还是我很接近?

由于直接引用已编译的库,您遇到了丢失的程序集错误。生成系统不知道它的依赖项(即ProtectedData.dll(,因此在您生成应用程序时,它不会将它们包含在您的输出文件夹中。

当您将库作为项目引用时,构建系统可以通过读取项目文件来了解库所依赖的一切,并将这些依赖项包含在输出文件夹中。

如果出于某种原因确实需要直接引用DLL,则需要将其依赖项(通常是构建它时的整个输出文件夹(复制到应用程序的目录中。

将其作为项目引用要容易得多,除非有一些约束阻止它。如果不可能,将其部署并引用为NuGet包是一种替代方案,可以确保您自动获得所有依赖项,但这也有其自身的复杂性。


关于你试图用appsettings做什么的话题,这是行不通的。

您正在调用的方法将传递到winapiCryptProtectDataCryptUnprotectData方法。它们使用从您的登录凭据派生的密钥,因此在一台机器上加密的数据不可能被另一台机器(甚至同一机器上的另一个用户(解密。

您可以在此处阅读存储敏感信息的其他方法:https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-6.0&tabs=窗口

最新更新