如何將哈希結果(字節數組)轉換爲字符串?將md5哈希字節數組轉換爲字符串
byte[] bytePassword = Encoding.UTF8.GetBytes(password);
using (MD5 md5 = MD5.Create())
{
byte[] byteHashedPassword = md5.ComputeHash(bytePassword);
}
我需要byteHashedPassword
轉換爲字符串。
如何將哈希結果(字節數組)轉換爲字符串?將md5哈希字節數組轉換爲字符串
byte[] bytePassword = Encoding.UTF8.GetBytes(password);
using (MD5 md5 = MD5.Create())
{
byte[] byteHashedPassword = md5.ComputeHash(bytePassword);
}
我需要byteHashedPassword
轉換爲字符串。
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);
您可以使用Convert.ToBase64String
和Convert.FromBase64String
輕鬆地將字節數組轉換爲字符串。
好,因爲它是一個哈希,它不能在一個正常的字符串顯示可能值,所以最好的辦法是將其轉換爲Base64編碼的字符串。
string s = Convert.ToBase64String(bytes);
,並使用
byte[] bytes = Convert.FromBase64(s);
得到字節回來。
那麼,你可以使用帶字節和編碼的字符串構造函數,但是你可能會很難管理字符串,因爲它可能包含很多有趣的字符(空字節,換行符,控制字符,等)
要做到這一點是與基地64編碼它得到一個不錯的字符串,它很容易與合作的最佳方式:
string s = Convert.ToBase64String(bytes);
,並從該字符串返回一個字節數組:
byte[] bytes = Convert.FromBase64String(s);
我總是發現這是最方便的:
string hashPassword = BitConverter.ToString(byteHashedPassword).Replace("-","");
對於一些奇怪的原因BitConverter喜歡把字節之間劃線,所以只替換刪除它們。
更新: 如果你更喜歡「小寫」十六進制,只需做一個.ToLower()和繁榮。
請注意,如果您將此操作設置爲緊密循環和許多操作,則這可能會很昂貴,因爲至少有兩個隱式字符串強制轉換和調整大小。
與@PhilippeLeybaert解決方案的作用相同,只是單行。 – sonjz 2013-07-03 20:05:04
如果你在'十六進制偏好'陣營,你可以做到這一點。這基本上是Philippe Leybaert回答的最小版本。
string.Concat(hash.Select(x => x.ToString("X2")))
B1DB2CC0BAEE67EA47CFAEDBF2D747DF
任何有興趣一NuGet包我創建了一個名爲CryptoStringify允許你使用一個乾淨的語法,將字符串轉換爲一個散列字符串,而不必玩弄字節數組:
using (MD5 md5 = MD5.Create())
{
string strHashedPassword = md5.Hash(password);
}
這是對擴展方法HashAlgorithm
和KeyedHashAlgorithm
因此適用於SHA1,HMACSHA1,SHA256等了。
什麼是上蓋的意義是什麼? – Blankman 2010-03-12 20:41:41
是一個偏好問題。這就是爲什麼我在我的方法中添加了一個參數,所以調用者可以選擇 – 2010-03-12 20:42:52
這就是'c0de'和'C0DE'之間的區別,就這些。 – 2010-03-12 20:43:23