如何将字节数组形式的哈希结果转换为字符串?
byte[] bytePassword = Encoding.UTF8.GetBytes(password);
using (MD5 md5 = MD5.Create())
{
byte[] byteHashedPassword = md5.ComputeHash(bytePassword);
}
我需要将 byteHashedPassword
转换成字符串。如何将字节数组形式的哈希结果转换为字符串?
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()
时,不需要重新发明轮子。 - Eric Petroelje我始终觉得这是最方便的:
string hashPassword = BitConverter.ToString(byteHashedPassword).Replace("-","");
由于某种奇怪的原因,BitConverter喜欢在字节之间放置破折号,因此替换只是将它们删除。
更新: 如果您喜欢“小写”十六进制,只需执行 .ToLower() 即可。
请注意,如果您将其作为紧密循环和多个操作来执行,这可能会很昂贵,因为至少有两个隐式字符串转换和调整大小发生。
Convert.ToBase64String
和 Convert.FromBase64String
将字节数组轻松转换为字符串。如果你支持“Hex偏好”,你可以这样做。这基本上是Philippe Leybaert的答案的最简版本。
string.Concat(hash.Select(x => x.ToString("X2")))
B1DB2CC0BAEE67EA47CFAEDBF2D747DF
由于哈希值可能包含无法在普通字符串中显示的字符,因此最好将其转换为Base64编码的字符串。
string s = Convert.ToBase64String(bytes);
并使用
byte[] bytes = Convert.FromBase64(s);
获取字节。
你可以使用带有字节和编码的字符串构造函数,但是由于它可能包含许多有趣的字符(空字节,换行符,控制字符等),因此你很难管理该字符串。
最好的方法是使用base64进行编码,以获得易于处理的漂亮字符串:
string s = Convert.ToBase64String(bytes);
要将该字符串转换回字节数组:
byte[] bytes = Convert.FromBase64String(s);
我知道这是一个老问题,但我想补充一下,你可以使用内置方法(我正在使用.NET 6.0):
Convert.ToBase64String(hashBytes);
(其他人已经提到了这个)Convert.ToHexString(hashBytes);
对于任何感兴趣的人,我创建了一个名为CryptoStringify的Nuget包,它允许您使用简洁明了的语法将字符串转换为哈希字符串,而无需玩弄字节数组:
using (MD5 md5 = MD5.Create())
{
string strHashedPassword = md5.Hash(password);
}
这是一个扩展方法,可用于 HashAlgorithm
和 KeyedHashAlgorithm
,因此也适用于 SHA1、HMACSHA1、SHA256 等。