86

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

byte[] bytePassword = Encoding.UTF8.GetBytes(password);

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

我需要转换byteHashedPassword为字符串。

4

7 回答 7

85
   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);
于 2010-03-12T20:40:59.440 回答
66

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

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

出于某种奇怪的原因,BitConverter 喜欢在字节之间放置破折号,因此替换只是删除了它们。

更新:如果您更喜欢“小写”十六进制,只需执行 .ToLower() 和繁荣。

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

于 2010-03-12T20:49:30.420 回答
29

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

于 2010-03-12T20:40:57.193 回答
21

如果您在“十六进制偏好”阵营中,您可以这样做。这基本上是 Philippe Leybaert 答案的最小版本。

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

B1DB2CC0BAEE67EA47CFAEDBF2D747DF

于 2013-12-22T01:57:37.290 回答
9

好吧,因为它是一个哈希,它可能具有无法在普通字符串中显示的值,因此最好的办法是将其转换为 Base64 编码的字符串。

string s = Convert.ToBase64String(bytes);

并使用

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

取回字节。

于 2010-03-12T20:41:05.587 回答
5

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

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

string s = Convert.ToBase64String(bytes);

并从该字符串返回一个字节数组:

byte[] bytes = Convert.FromBase64String(s);
于 2010-03-12T20:42:37.453 回答
0

对于任何对我创建的名为CryptoStringify的 Nuget 包感兴趣的人,您可以使用简洁的语法将字符串转换为散列字符串,而无需使用字节数组:

using (MD5 md5 = MD5.Create())
{
    string strHashedPassword = md5.Hash(password);
}

它是一种扩展方法HashAlgorithmKeyedHashAlgorithm因此也适用于 SHA1、HMACSHA1、SHA256 等。

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

于 2015-05-30T00:21:39.323 回答