2010-03-12 34 views
11

我做一個MD5哈希值,而只想確保結果:md5散列一致或服務器依賴的結果?

md5.ComputeHash(bytePassword); 

是一致的,無論服務器的?

例如窗戶2003/2008和32/64位等

+3

你正在做一個md5散列來掩蓋數據庫中的密碼嗎?你不應該http://wblinks.com/notes/storing-passwords-the-wrong-better-and-even-better-way – gingerbreadboy 2010-03-12 23:00:44

回答

18

是的,這是一致的,無論md5 algorithm specification定義平臺的它。

+3

除了我已經看到了一些系統代表用大寫字母輸出和一些低大寫字母。如果您要比較輸出的字符串表示形式,請確保進行不區分大小寫的比較。 – 2010-03-12 21:17:52

+2

您是否將具有MD5值( - >「Numerical」)的十六進制表示( - > String)混合起來並進行字符串比較?在這種情況下,可能會發生有效的十六進制字符爲小寫或大寫 - 但值相同。換句話說:如果您將0xAa與0xaA進行比較並考慮相關案例,那麼您沒有正確比較,我會考慮這個錯誤。 – 2010-03-12 23:49:04

+0

這裏的情況是不相關的,因爲該方法返回一個字節數組 - 如果他想將它轉換爲表示字節的字符串作爲十六進制值,那麼它會很重要。 – BrainSlugs83 2012-01-26 21:37:21

1

MD5散列是[除輸入系統/時間/任何]獨立

3

MD5哈希的結果是一個數字。對於給定的輸入返回的數字總是相同的,無論使用哪種服務器甚至平臺。

但是,該數目的表達可以變化。例如,11.0是相同的數字,但表達方式不同。類似地,某些平臺將返回的格式與其他格式稍有不同。在這種情況下,你有一個字節數組,這應該是相當安全的通過。在將其轉換爲字符串後,請謹慎操作。

6

MD5是獨立的操作系統和架構。所以它是「一致的」。

然而,MD5將任意位的序列作爲輸入,並且輸出128位的序列。在很多情況下,你需要字符串。例如,你想散列一個密碼,密碼最初是一個字符串。將該字符串轉換爲位序列不是MD5本身的一部分,並且存在若干約定。我不完全知道C#,但Java等效方法將使用「平臺默認字符集」,這可能隨操作系統安裝而變化。同樣,MD5的輸出通常被轉換爲十六進制符號的字符串,並且可能是大寫或小寫或其他。

所以,雖然MD5本身是一致的,錯誤往往潛伏在其中準備MD5和處理後的輸出數據的部分。謹防。

+0

在C#/ .NET中,您應該指定您想要的編碼使用 - 例如:Encoding.UTF8.GetBytes(「Blah」),Encoding.ASCII.GetBytes(「Blah」),Encoding.UTF32.GetBytes(「Blah」)... – BrainSlugs83 2012-01-26 21:40:40