SHA1哈希算法问题
本文关键字:问题 算法 哈希 SHA1 | 更新日期: 2023-09-27 18:01:47
我试图在我的程序中存储用户的密码,但我不想以纯文本的形式存储它。因此,我对它进行哈希并存储它,当用户需要在程序启动时输入他的密码时(为了防止未经授权的用户),我对输入的密码进行哈希并比较两个哈希值。
但是,下面的代码对几乎所有输入的密码都生成相同的散列。谁能告诉我如何修复下面的代码,或指导我到一个更好的哈希函数?
public static string getSHA1(string userPassword)
{
return BitConverter.ToString(SHA1Managed.Create().ComputeHash(Encoding.Default.GetBytes(userPassword))).Replace("-", "");
}
感谢您的帮助。
使用如下代码
private static string GetSHA1(string text)
{
UnicodeEncoding UE = new UnicodeEncoding();
byte[] hashValue;
byte[] message = UE.GetBytes(text);
SHA1Managed hashString = new SHA1Managed();
string hex = "";
hashValue = hashString.ComputeHash(message);
foreach (byte x in hashValue)
{
hex += String.Format("{0:x2}", x);
}
return hex;
}
我将您的函数插入到一个新项目中,它似乎工作正常,因此检查如何将密码提供给该函数。我对使用Encoding.Default
而不是显式编码持谨慎态度,因为它说它依赖于系统。
这是我做的:
public static string getSHA1(string userPassword)
{
return Convert.ToBase64String(new SHA1Managed().ComputeHash(Encoding.Unicode.GetBytes(userPassword)));
}
注意:正如评论中指出的那样,以这种方式进行密码存储/匹配是不好的:
- 你正在使用快速哈希算法。您希望密码散列速度较慢,以减轻暴力攻击。比特币在这方面做得很好。
- 你没有在你的hash上撒盐。盐渍意味着在散列之前向密码中添加一些随机数据,然后将随机数据与散列一起存储。这使得彩虹表(密码映射的巨大散列)无用。