簡體   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