SHA1哈希算法问题

时间:2011-07-11 00:51:05

标签: c# .net hash-function cryptographic-hash-function

我正在尝试将用户密码存储在我的程序中,但我不想将其存储为纯文本。因此,我正在对它进行哈希并存储,当用户需要在程序启动时输入密码(以防止未经授权的用户),我正在哈希输入的密码并比较两个哈希值。

但是,以下代码为几乎所有输入的密码生成相同的哈希值。任何人都可以告诉我如何修复以下代码,或者指导我更好的哈希函数吗?

public static string getSHA1(string userPassword)
{
    return BitConverter.ToString(SHA1Managed.Create().ComputeHash(Encoding.Default.GetBytes(userPassword))).Replace("-", "");
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

使用类似的东西

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

答案 1 :(得分:0)

我将你的功能插入一个新项目,似乎工作正常,所以检查密码是如何提供给该功能的。我会谨慎使用Encoding.Default而不是显式编码,因为它说它依赖于系统。

这是我制作的那个:

    public static string getSHA1(string userPassword)
    {
        return Convert.ToBase64String(new SHA1Managed().ComputeHash(Encoding.Unicode.GetBytes(userPassword)));
    }

注意:正如评论中指出的那样,以这种方式进行密码存储/匹配是不好的:

  • 您使用的是快速哈希算法。您希望密码散列缓慢以缓解暴力攻击。 Bcrypt做得很好。
  • 你没有腌制哈希。 Salting意味着在散列之前向密码添加一些随机数据,然后将随机数据与散列一起存储。这使得彩虹表(密码映射的巨大哈希)无用。