【问题标题】:How can i encrypt a stored password that any user could decrypt on use of an application?如何加密任何用户可以在使用应用程序时解密的存储密码?
【发布时间】:2019-07-23 13:02:59
【问题描述】:

我有可以加密和解密提供给方法的字符串的工作代码,这一切都适用于我存储用户输入的密码以方便以后使用。

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

因为我使用了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);
}

是否有其他方法可以在需要时解密密码并出于安全原因以加密格式提供密码?

【问题讨论】:

  • 您的应用程序配置文件是 Xml 配置文件(app.configweb.config)吗?
  • @JoshuaRobinson 是的,我正在使用 app.config
  • "im storing a users entered password for convenience later." 不要那样做! 加密/解密用户密码是不行的!!你必须散列 用户密码,与加密不同。 散列值无法解密!。要验证登录尝试,您还可以散列尝试的密码,然后比较散列。即使那是简化版。查看 bcrypt/scrypt 库。
  • 如果任何用户都可以解密它,你为什么要加密它?处理您面临的首要问题的正确方法是不使用用户名和密码来验证数据库,使用集成安全性,它将使用当前登录到计算机的用户,并将验证问题转移到 SQL 服务器本地的。
  • 数据库不是我自己的所以无法更改身份验证,所有者/创建者/企业已决定使用 SQL 帐户身份验证,所以我需要效仿。至于不存储密码,我很清楚这一点和协议,但是当创建具有只读访问权限的通用帐户并且需要密码才能通过执行的 SQL 查询查看数据库时,还有什么其他解决方案?必须向用户和通行证提供一些方法,这就是为什么程序会在需要时自动对其进行加密和解密

标签: c# dpapi


【解决方案1】:

由于您使用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. 导出自定义 RSA 加密密钥(1 个时间步)
  3. 导入证书(1 个时间步 - 每台机器)
  4. 向证书添加权限(1 个时间步 - 每台机器)
  5. 加密配置部分
  6. 解密配置部分

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

【讨论】:

  • 不幸的是,这不是我正在寻找的解决方案,谢谢
  • 哦,那太糟糕了。请问为什么不呢?
猜你喜欢
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 2011-01-03
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多