如何将哈希结果(字节数组)转换为字符串?将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