如何将散列结果(即字节数组)转换为字符串?
byte[] bytePassword = Encoding.UTF8.GetBytes(password);
using (MD5 md5 = MD5.Create())
{
byte[] byteHashedPassword = md5.ComputeHash(bytePassword);
}
我需要转换byteHashedPassword
为字符串。
Answers:
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()
我总是觉得这是最方便的:
string hashPassword = BitConverter.ToString(byteHashedPassword).Replace("-","");
出于某种奇怪的原因,BitConverter喜欢将破折号放在字节之间,因此替换操作将其删除。
更新:如果您希望使用“小写”十六进制,只需执行.ToLower()和繁荣。
请注意,如果您这样做是一个紧密循环,并且很多操作可能会很昂贵,因为至少要进行两次隐式字符串强制转换和调整大小。
好吧,您可以使用需要字节和编码的字符串构造函数,但是由于其中可能包含很多有趣的字符(空字节,换行符,控制字符等),因此可能很难管理字符串。
最好的方法是使用base 64对其进行编码,以获得易于使用的漂亮字符串:
string s = Convert.ToBase64String(bytes);
并从该字符串返回字节数组:
byte[] bytes = Convert.FromBase64String(s);
对于感兴趣的人,我创建的一个名为CryptoStringify的Nuget包允许您使用一种简洁的语法将字符串转换为哈希字符串,而无需使用字节数组:
using (MD5 md5 = MD5.Create())
{
string strHashedPassword = md5.Hash(password);
}
它是一种扩展方法HashAlgorithm
,KeyedHashAlgorithm
因此也可以在SHA1,HMACSHA1,SHA256等上使用。