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

问题描述 投票:0回答:2

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

我尝试了一种方法,并且非常接近让它发挥作用,但也许有更好的方法。我的做法:

  1. 在我的 appsettings.json 文件中设置加密值。这些加密值是通过以下 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,版本= 6.0.0.0,文化=中性,PublicKeyToken = b03f5f7f11d50a3a”。系统找不到指定的文件。'

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

那么,我这样做本质上是错误的,还是我已经接近了?

c# encryption dll .net-5
2个回答
2
投票

您遇到了缺少程序集的错误,因为您直接引用编译的库。构建系统不知道其依赖项(即 ProtectedData.dll),因此在构建应用程序时它不会将它们包含在输出文件夹中。

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

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

将其作为项目引用要容易得多,除非有一些限制阻止它。如果不可能,将其作为 NuGet 包进行部署和引用是一种替代方案,它将确保您自动获取所有依赖项,但这会带来其自身的复杂性。


关于您尝试使用应用程序设置执行的操作,这是行不通的。

您调用的方法会传递给 winapi

CryptProtectData
CryptUnprotectData
方法。他们使用从您的登录凭据派生的密钥,因此一台计算机上加密的数据不可能被另一台计算机(甚至同一台计算机上的另一个用户)解密。

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


0
投票

您可以查看ProtectedJson,加密算法可以通过Asp.NET数据保护API完全配置,它与ConfigurationBuilder无缝集成,并且NuGet包适用于.NET和.NET Core

© www.soinside.com 2019 - 2024. All rights reserved.