关于c#:将md5哈希字节数组转换为字符串

Converting a md5 hash byte array to a string

如何将哈希结果(字节数组)转换为字符串?

1
2
3
4
5
6
byte[] bytePassword = Encoding.UTF8.GetBytes(password);

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

我需要把byteHashedPassword转换成字符串。


1
2
3
4
5
6
7
8
9
   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();
    }

然后可以将其作为扩展方法调用:

1
string hexString = byteArray.ToHex(false);


我一直觉得这是最方便的:

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

出于某种奇怪的原因,bitconverter喜欢在字节之间加破折号,因此替换只会删除它们。

更新:如果您喜欢"小写"十六进制,只需执行.tolower()和boom即可。

请注意,如果您将此作为一个紧密循环和许多操作来执行,这可能会很昂贵,因为至少有两个隐式字符串强制转换和大小调整正在进行。


可以使用Convert.ToBase64StringConvert.FromBase64String轻松地将字节数组转换为字符串。


如果你在"六角形偏好"阵营,你可以这样做。这基本上是Philippe Leybaert给出的答案的最低版本。

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

B1DB2CC0BAEE67EA47CFAEDBF2D747DF


因为它是一个散列,所以它的值可能无法在普通字符串中显示,所以最好将其转换为base64编码的字符串。

1
string s = Convert.ToBase64String(bytes);

使用

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

以取回字节。


好吧,您可以使用接受字节和编码的字符串构造函数,但是您很可能难以从中管理字符串,因为它可能包含许多有趣的字符(空字节、换行符、控制字符等)。

最好的方法是用base 64对其进行编码,以得到一个易于使用的好字符串:

1
string s = Convert.ToBase64String(bytes);

从字符串返回字节数组:

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


对于任何感兴趣的人,我创建的一个名为cryptoStringify的nuget包允许您使用一个很好的干净语法将字符串转换为哈希字符串,而不必使用字节数组:

1
2
3
4
using (MD5 md5 = MD5.Create())
{
    string strHashedPassword = md5.Hash(password);
}

它是对HashAlgorithmKeyedHashAlgorithm的一种扩展方法,因此也适用于sha1、hmacsha1、sha256等。

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