C#正在读取加密的密码
本文关键字:密码 加密 读取 | 更新日期: 2023-09-27 17:48:49
我正在使用下面的代码将密码保存到注册表中,如何将其转换回?下面的代码不是我的,但它加密得很好。
感谢
using System.Security.Cryptography;
public static string EncodePasswordToBase64(string password)
{ byte[] bytes = Encoding.Unicode.GetBytes(password);
byte[] dst = new byte[bytes.Length];
byte[] inArray = HashAlgorithm.Create("SHA1").ComputeHash(dst);
return Convert.ToBase64String(inArray);
}
SHA1是哈希算法,而不是加密算法。哈希算法是一种单向函数,它将数据转换为该数据的哈希,但无法从哈希中获取原始数据。加密算法是一种双向函数,它将数据转换为加密数据,然后将加密数据转换回原始数据。
要安全地存储密码以便可以读回,请使用ProtectedData类。
public static string ProtectPassword(string password)
{
byte[] bytes = Encoding.Unicode.GetBytes(password);
byte[] protectedPassword = ProtectedData.Protect(bytes, null, DataProtectionScope.CurrentUser);
return Convert.ToBase64String(protectedPassword);
}
public static string UnprotectPassword(string protectedPassword)
{
byte[] bytes = Convert.FromBase64String(protectedPassword);
byte[] password = ProtectedData.Unprotect(bytes, null, DataProtectionScope.CurrentUser);
return Encoding.Unicode.GetString(password);
}
将用户输入的任何内容作为密码来访问系统,以相同的方式对其进行加密,然后比较加密的值,这是正常的方法。我很确定SHA1是一个活板门加密,即不能回溯。
您没有。
SHA1是一个散列,而不是加密。这是一种单向操作;转换回来是不可能的。
(好吧,这不是完全正确的;如果你有一个可能的SHA1值和纯文本值的表,一个彩虹表,那么你可能很幸运)
此外,你应该对你的哈希进行调味,因为你现在很容易受到彩虹表攻击。Jeff在他的博客
好吧,我知道这不是在回答你的特定Q,但你为什么要把它转换回来?
如果要进行比较以提供身份验证,标准方法是对该文本也进行加密,并将存储的密码与提供的密码进行比较。
这更安全,因为这意味着原始密码永远不需要解密。
我认为使用哈希的一个要点是它们不能被计算回来。
正如其他人所说,根据用户的密码计算哈希值,并与存储的哈希值进行比较。
为了使用系统。安全密码学。ProtectedData类,则必须添加对System的引用。项目的安全性。
(用鼠标右键单击References文件夹,选择"Add Reference…",在.NET选项卡上找到System.Security)
嗯,只是好奇,但对于相同长度的所有密码,这不会返回相同的哈希吗?
使用您自己的上面的代码片段,您想要做的是在用户最初选择密码时调用该方法,但在密码字符串中的某个位置(通常在开头或结尾)添加所谓的salt。然后,当用户稍后尝试进行身份验证时,他们输入了密码,您可以通过相同的方法将该密码与哈希一起运行,如果两个哈希相等,那么从统计数据来看,密码相等且有效的可能性很大。
话虽如此,众所周知,SHA1有弱点,您应该选择更强的算法。如果你想留在SHA家族,SHA512是相当不错的。
您希望使用加密而不是哈希。SHA很好,但要使用加密方法。加密的问题总是把密钥放在哪里。你没有提到这是工作站还是服务器。在服务器上,我发现只使用ACL来限制对reg密钥的访问更好。管理员通常可以访问加密密钥。。。你必须在某个地方有一些信任。在工作站上,你可以进行加密并将密钥存储在代码中,或者使用证书并限制访问,至少在公司环境中是这样。。。非销售软件)。
您可以使用ProtectedData类,但要注意,它使用用户配置文件进行密钥使用,因此,您必须确保使用所需密钥模拟具有配置文件的用户。这可能是琐碎的,也可能不是琐碎的,可能会引起头痛和安全问题。
我注意到最近添加了XMLEncryptedData类。对于将数据加密到XML文件,XMLEncryptedData方法是否比DPAPI方法更可取?