2011-09-23 151 views
0

我只是用簡單的散列瞎搞,因爲我是新來的想法,我有以下幾點:sha1哈希不工作? 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函數會爲同一個字符串返回兩個不同的哈希值?

回答

2

在這種情況下,我並不確定,但通常你不只是散列密碼,而是密碼和一些額外的隨機噪聲(通常稱爲salt-value)。 這樣做是爲了讓這一切比單獨的密碼更安全。 如果你只存儲密碼,那麼攻擊者可能只是散列字典,並找到很多接受密碼。 我想在幕後也會發生同樣的情況。

你有沒有考慮過自己散列密碼(System.Security)而不是使用FormAuthentication-Service?

看看SHA1Managed .ComputeHash方法。 基本上,您只需將UnicodeEncoding.GetBytes或任何您想要的字符串編碼到字節數組中,然後調用此方法來獲取散列字節數組。比你可以用Convert.ToBase64String來改變它,以得到一個字符串 - 這是沒有這個鹽我談到了,所以你可能在進入生產之前閱讀這個鹽。

+0

甚至不知道該怎麼做...... – TheJediCowboy

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