C#读回加密密码

时间:2008-11-06 15:25:22

标签: c# hash

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

由于

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);
}

11 个答案:

答案 0 :(得分:32)

SHA1是哈希算法,而不是加密算法。哈希算法是一种单向函数,它将数据转换为该数据的哈希值,但原始数据不能从哈希值中获取。加密算法是一种双向函数,可将数据转换为加密数据,然后可将加密数据转换回原始数据。

答案 1 :(得分:12)

要安全地存储密码以便可以回读,请使用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);
}

答案 2 :(得分:8)

将用户输入的任何内容作为密码来访问系统,以相同的方式对其进行加密,然后比较加密值,这是正常的方法。我很确定SHA1是陷门加密,即无法回溯。

答案 3 :(得分:7)

你没有。

SHA1是哈希,而不是加密。这是单向操作;转换回来是不可能的。

(好的,这不是严格意义上的;如果你有一个可能的SHA1值和纯文本值的表,那么彩虹表就可以运气了)

此外,你应该腌制你的哈希,因为你现在很容易受到彩虹桌攻击。杰夫talks about this在他的博客上多了一点

答案 4 :(得分:3)

好的,所以我知道这不是回答您的具体问题,但为什么要将其转换回来?

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

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

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

答案 8 :(得分:0)

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

话虽如此,众所周知,SHA1存在缺陷,你应该选择更强大的算法。如果你想留在SHA系列,SHA512非常好。

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

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