如何加密存储的密码,任何用户都可以使用应用程序解密该密码?

时间:2019-07-23 13:02:59

标签: c# dpapi

我有有效的代码,可以对提供给方法的字符串进行加密和解密,并且当我存储用户输入的密码以方便以后使用时,这一切都很好。

但是我想做的是在应用程序配置文件中提供一个密码(加密),该密码允许用户从同一域中的SQL Server中提取数据。

因为我已将ProtectedData.ProtectDataProtectionScope.CurrentUser一起使用,所以它已使用我作为密钥进行了加密,这意味着用户无法解密此密钥,并且DataProtectionScope.LocalMachine也不适用。

private static byte[] Entropy = { // Some arbitrary numbers };

public static string Encrypt(string _toEncrypt)
{
    byte[] originalText = Encoding.Unicode.GetBytes(_toEncrypt);
    byte[] EncryptedText = ProtectedData.Protect(originalText, Entropy, DataProtectionScope.CurrentUser);
    return Convert.ToBase64String(EncryptedText);
}

public static string Decrypt(string _toDecrypt)
{
    byte[] EncryptedText = Convert.FromBase64String(_toDecrypt);
    byte[] OriginalText = ProtectedData.Unprotect(EncryptedText, Entropy, DataProtectionScope.CurrentUser);
    return Encoding.Unicode.GetString(OriginalText);
}

还有另一种方法可以允许出于安全原因在需要时解密密码并以加密格式提供密码吗?

1 个答案:

答案 0 :(得分:0)

由于您将app.config用于配置文件,因此实际上可以使用aspnet_regiis实用程序来加密文件的各个部分。

已经有一段时间了,但是如果您进行一些搜索(for example,互联网上就会有一些资源。但是,如果我没记错的话,这些步骤基本上是:

  1. 暂时将您的app.config重命名为web.config,因为 aspnet_regiis仅适用于web.config
  2. 打开开发人员命令提示符(可能需要以管理员身份进行操作)。
  3. 运行aspnet_regiis -pef <the section you're encrypting> <path to your web.config>。路径应该只是可以在其中找到配置文件的文件夹,不要包含web.config
  4. 将您的配置文件重命名为app.config

这将需要在托管应用程序的服务器或计算机上运行。如果您的应用程序不是从单个服务器上运行,则事情变得更加复杂,因为您必须导出密钥并导入它运行到运行该应用程序的每台计算机上。 This article包含以下步骤:

  
      
  1. 创建计算机级RSA密钥容器(1个时间步)
  2.   
  3. 导出自定义RSA加密密钥(1个时间步骤)
  4.   
  5. 导入证书(1步-每台计算机)
  6.   
  7. 向证书添加权限(1步-每台计算机)
  8.   
  9. 加密配置部分
  10.   
  11. 解密配置节
  12.   

您实际上不需要在应用程序中进行任何特殊的解密。配置系统将自动为您处理。