1

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

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

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

感谢您的任何帮助。

4

2 回答 2

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;
    }
于 2011-07-11T01:09:14.413 回答
0

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

这是我做的一个:

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

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

  • 您正在使用快速散列算法。您希望密码哈希变慢以减轻暴力攻击。Bcrypt在这方面做得很好。
  • 你没有给你的哈希加盐。加盐意味着在散列之前将一些随机数据添加到密码中,然后将随机数据与散列一起存储。这使得彩虹表(密码映射的巨大散列)毫无用处。
于 2011-07-11T01:02:56.487 回答