2010-03-12 150 views
58

如何將哈希結果(字節數組)轉換爲字符串?將md5哈希字節數組轉換爲字符串

byte[] bytePassword = Encoding.UTF8.GetBytes(password); 

using (MD5 md5 = MD5.Create()) 
{ 
    byte[] byteHashedPassword = md5.ComputeHash(bytePassword); 
} 

我需要byteHashedPassword轉換爲字符串。

回答

66
public static string ToHex(this byte[] bytes, bool upperCase) 
    { 
     StringBuilder result = new StringBuilder(bytes.Length*2); 

     for (int i = 0; i < bytes.Length; i++) 
      result.Append(bytes[i].ToString(upperCase ? "X2" : "x2")); 

     return result.ToString(); 
    } 

然後你可以把它作爲一個擴展的方法:

string hexString = byteArray.ToHex(false); 
+0

什麼是上蓋的意義是什麼? – Blankman 2010-03-12 20:41:41

+3

是一個偏好問題。這就是爲什麼我在我的方法中添加了一個參數,所以調用者可以選擇 – 2010-03-12 20:42:52

+0

這就是'c0de'和'C0DE'之間的區別,就這些。 – 2010-03-12 20:43:23

22

您可以使用Convert.ToBase64StringConvert.FromBase64String輕鬆地將字節數組轉換爲字符串。

8

好,因爲它是一個哈希,它不能在一個正常的字符串顯示可能值,所以最好的辦法是將其轉換爲Base64編碼的字符串。

string s = Convert.ToBase64String(bytes); 

,並使用

byte[] bytes = Convert.FromBase64(s); 

得到字節回來。

2

那麼,你可以使用帶字節和編碼的字符串構造函數,但是你可能會很難管理字符串,因爲它可能包含很多有趣的字符(空字節,換行符,控制字符,等)

要做到這一點是與基地64編碼它得到一個不錯的字符串,它很容易與合作的最佳方式:

string s = Convert.ToBase64String(bytes); 

,並從該字符串返回一個字節數組:

byte[] bytes = Convert.FromBase64String(s); 
53

我總是發現這是最方便的:

string hashPassword = BitConverter.ToString(byteHashedPassword).Replace("-",""); 

對於一些奇怪的原因BitConverter喜歡把字節之間劃線,所以只替換刪除它們。

更新: 如果你更喜歡「小寫」十六進制,只需做一個.ToLower()和繁榮。

請注意,如果您將此操作設置爲緊密循環和許多操作,則這可能會很昂貴,因爲至少有兩個隱式字符串強制轉換和調整大小。

+0

與@PhilippeLeybaert解決方案的作用相同,只是單行。 – sonjz 2013-07-03 20:05:04

12

如果你在'十六進制偏好'陣營,你可以做到這一點。這基本上是Philippe Leybaert回答的最小版本。

string.Concat(hash.Select(x => x.ToString("X2"))) 

B1DB2CC0BAEE67EA47CFAEDBF2D747DF

0

任何有興趣一NuGet包我創建了一個名爲CryptoStringify允許你使用一個乾淨的語法,將字符串轉換爲一個散列字符串,而不必玩弄字節數組:

using (MD5 md5 = MD5.Create()) 
{ 
    string strHashedPassword = md5.Hash(password); 
} 

這是對擴展方法HashAlgorithmKeyedHashAlgorithm因此適用於SHA1,HMACSHA1,SHA256等了。

https://www.nuget.org/packages/cryptostringify

相關問題