繁体   English   中英

sha1哈希不起作用? C#

[英]sha1 Hash Not working? C#

我只是在搞混简单的哈希,因为我是这个想法的新手,我有以下几点:

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()方法,但是它们的结果不同。

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

在这种情况下,我不能完全确定,但是通常情况下,您不仅会散列密码,还会散列密码和保存在旁边的其他一些随机噪声(通常称为salt-value)。 这样做是为了使这一切比单独的密码更加安全。 如果仅存储密码,则攻击者可能只对字典进行哈希处理并找到大量接受的密码。 我想幕后也在发生同样的事情。

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

看一下SHA1Managed .ComputeHash方法。 基本上,您只是使用UnicodeEncoding.GetBytes或任何您想要的东西将字符串编码为字节数组,然后调用此方法以获取哈希的字节数组。 比起您可以用Convert.ToBase64String转换它来返回一个字符串-这是我所说的, 没有盐,因此您可以在投入生产之前阅读此内容。

在多次调用该函数期间,散列结果将相同。 您可能需要在哈希之前调用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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM