将 md5 哈希字节数组转换为字符串

问题描述 投票:0回答:9

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

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

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

我需要将

byteHashedPassword
转换为字符串。

c# hash cryptography md5 cryptographic-hash-function
9个回答
91
投票
   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);

70
投票

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

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

由于某些奇怪的原因,BitConverter 喜欢在字节之间放置破折号,因此替换只是将其删除。

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

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


31
投票

您可以使用

Convert.ToBase64String
Convert.FromBase64String
轻松将字节数组转换为字符串。


24
投票

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

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

B1DB2CC0BAEE67EA47CFAEDBF2D747DF


10
投票

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

string s = Convert.ToBase64String(bytes);

并使用

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

取回字节。


7
投票

嗯,您可以使用接受字节和编码的字符串构造函数,但是您可能会得到一个难以管理的字符串,因为它可能包含很多有趣的字符(空字节、换行符、控制字符等)

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

string s = Convert.ToBase64String(bytes);

从该字符串返回字节数组:

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

2
投票

我知道这是一个老问题,但我想我会添加你可以使用内置方法(我正在使用.NET 6.0):

  • Convert.ToBase64String(hashBytes);
    (其他人已经提到过)
  • Convert.ToHexString(hashBytes);

0
投票

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

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

它是

HashAlgorithm
KeyedHashAlgorithm
的扩展方法,因此也适用于 SHA1、HMACSHA1、SHA256 等。

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


0
投票

我参加聚会迟到了,但有两个可行的选择:

@Philippe Leybaert 的答案是一个紧凑的 LINQ 解决方案,并进行了一些小的优化:

public string ToHexString(this ICollection<byte> bytes, bool uppercase = true)
{
    var formatString = uppercase ? "{0:X2}" : "{0:x2}";

    var stringBuilder = bytes.Aggregate(
        new StringBuilder(bytes.Count * 2),
        (stringBuilder, nextByte) => stringBuilder.AppendFormat(formatString, nextByte));

    return stringBuilder.ToString();
}

比 StringBuilder 方法更快的版本:

public static class BytesToHexStringHelpers
{       
    public static string ToHexString(this byte[] bytes)
        => return ToHexString(bytes, 0, bytes.Length);
        
    public static string ToHexString(this byte[] bytes, int startIndex, int length)
    {
        const string HexadecimalUppercase = "0123456789ABCDEF";
        
        var hexChars = new char[length * 2];
        var hexCharsIndex = 0;
        var endIndex = startIndex + length;
        
        for (var bytesIndex = startIndex; bytesIndex < endIndex; bytesIndex++)
        {
            hexChars[hexCharsIndex++] = HexadecimalUppercase[bytes[bytesIndex] >> 4];
            hexChars[hexCharsIndex++] = HexadecimalUppercase[bytes[bytesIndex] & 0xF];
        }

        return new string(chars);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.