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

C#正在读取加密的密码

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方法更可取?