sha1 Hash不工作? C#

时间:2011-09-23 04:58:02

标签: c# security sha1

我只是在处理简单的哈希,因为我对这个想法不熟悉,而且我有以下内容:

public string Password {get;set;}
public static string Hash(string password)
    {
        return FormsAuthentication.HashPasswordForStoringInConfigFile(password, "sha1");
    }

    public bool Authenticate(AccountDataContext context)
    {
        var password = context.UserAccounts.FirstOrDefault(p => p.UserAccountUID == UserAccountUID).Password;
        var hash = Hash(Password);
        return password.Equals(hash);
    }

注意这不是生产代码,所以我并不担心目前的安全性......

现在,当我最初在用户注册时散列密码时,如下所示

var password = "Password";
var hashedPassword = UserAccount.Hash(password)

然后我将其与用户一起存储。

当我验证我的用户时,我会调用Authenticate()方法,我认为它将返回相同的哈希值,因为它将相同的值传递给Hash()方法,但它们的出现方式不同。 / p>

为什么Hash函数会为同一个字符串返回两个不同的哈希值?

2 个答案:

答案 0 :(得分:2)

在这种情况下,我并不完全确定,但是你不仅要密码密码,还要密码和一些额外的随机噪音(通常称为盐值)。 这样做是为了使这一切比单独的密码更安全。 如果你只存储pwd,那么攻击者可以只是哈希字典并找到很多接受的密码。 我想在幕后也会发生同样的情况。

您是否考虑过自己使用Hashing密码(System.Security)而不是使用FormAuthentication-Service?

请查看SHA1Managed。ComputeHash方法。 基本上,您只需将UnicodeEncoding.GetBytes或其他任何内容编码的字符串编码为字节数组,并调用此方法获取散列字节数组。你可以用Convert.ToBase64String转换它来获得一个字符串 - 这是没有我讨论的这个盐,所以你可以在进入生产之前阅读这个。

答案 1 :(得分:1)

在多次调用函数期间,散列结果将相同。您可能希望在散列之前调用String.Trim(),以确保在进行散列之前字符串中的任何位置都没有空格。

您发布的片段也不应该显示为:

public bool Authenticate(AccountDataContext context)
{
    var password = context.UserAccounts.FirstOrDefault(p => p.UserAccountUID == UserAccountUID).Password;
    var hash = Hash(password); //lower case password, not Password.
    return password.Equals(hash);
}