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("-", "");
}

感谢您的帮助。

SHA1哈希算法问题

使用如下代码

    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上撒盐。盐渍意味着在散列之前向密码中添加一些随机数据,然后将随机数据与散列一起存储。这使得彩虹表(密码映射的巨大散列)无用。