【发布时间】:2019-07-23 13:02:59
【问题描述】:
我有可以加密和解密提供给方法的字符串的工作代码,这一切都适用于我存储用户输入的密码以方便以后使用。
但是我想要做的是在应用程序配置文件中提供一个密码(加密),允许用户从同一域上的 SQL 服务器中提取数据。
因为我使用了ProtectedData.Protect 和DataProtectionScope.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.config或web.config)吗? -
@JoshuaRobinson 是的,我正在使用 app.config
-
"
im storing a users entered password for convenience later." 不要那样做! 加密/解密用户密码是不行的!!你必须散列 用户密码,与加密不同。 散列值无法解密!。要验证登录尝试,您还可以散列尝试的密码,然后比较散列。即使那是简化版。查看 bcrypt/scrypt 库。 -
如果任何用户都可以解密它,你为什么要加密它?处理您面临的首要问题的正确方法是不使用用户名和密码来验证数据库,使用集成安全性,它将使用当前登录到计算机的用户,并将验证问题转移到 SQL 服务器本地的。
-
数据库不是我自己的所以无法更改身份验证,所有者/创建者/企业已决定使用 SQL 帐户身份验证,所以我需要效仿。至于不存储密码,我很清楚这一点和协议,但是当创建具有只读访问权限的通用帐户并且需要密码才能通过执行的 SQL 查询查看数据库时,还有什么其他解决方案?必须向用户和通行证提供一些方法,这就是为什么程序会在需要时自动对其进行加密和解密