C#读回加密密码

我正在使用下面的代码将密码保存到注册表中,如何将其转换回来? 下面的代码不是我的,但它加密很好。

谢谢

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值和纯文本值的表,彩虹表,那么你可能会运气)

你也应该用盐水腌制,因为你现在很容易受到彩虹表攻击。 杰夫在他的博客上谈了这个

好的,所以我知道这不是回答你的具体问题,但你为什么要把它转换回去?

如果要进行比较以提供身份validation,则标准方法是对此文本进行加密,并将存储的密码与提供的密码进行比较。

这更安全,因为这意味着永远不需要解密原始密码。

我认为使用哈希的一个要点是它们无法计算回来。

正如其他人所说,从用户的密码计算哈希值并与存储的哈希值进行比较。

要使用System.Security.Cryptography.ProtectedData类,必须将对System.Security的引用添加到项目中。

(在References文件夹上单击鼠标右键,选择“Add Reference …”,在.NET选项卡上找到System.Security)

嗯,只是好奇但不会为相同长度的所有密码返回相同的哈希值?

使用上面自己的代码片段,您要做的是在用户最初选择密码时调用该方法 – 但在密码字符串中的某处(通常在开头或结尾)添加密码。 然后,当用户稍后尝试进行身份validation时,他们输入密码,您通过相同的方法运行该密码,如果两个哈希值相等,则密码相等且有效的统计上非常可能。

话虽如此,已知SHA1存在弱点,您应该选择更强大的算法。 如果你想留在SHA系列,SHA512非常好。

您想使用加密而不是散列。 SHA很好,但使用加密方法。 加密的问题始终是放置密钥的位置。 您没有提到这是您正在执行此操作的工作站还是服务器。 在服务器上,我发现最好只使用ACL来限制对reg密钥的访问。 管理员通常也可以访问加密密钥……你必须在某个地方有一些信任。 在工作站上,您可以使用加密并将密钥存储在代码中或使用证书并至少在公司环境中限制对它的访问…而不是销售软件。

您可以使用ProtectedData类,但要注意它使用用户配置文件作为其密钥用法,因此您必须确保模拟具有所需密钥的配置文件的用户。 这可能是也可能不是微不足道的,可能会也可能不会引起头痛和安全问题。

我注意到最近添加了XMLEncryptedData类。 为了将数据加密到XML文件,XMLEncryptedData方法比DPAPI方法更理想吗?