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

92

如何将字节数组形式的哈希结果转换为字符串?

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

using (MD5 md5 = MD5.Create())
{
    byte[] byteHashedPassword = md5.ComputeHash(bytePassword);
} 
我需要将 byteHashedPassword 转换成字符串。

1
MD5已经被弃用。它本质上是有缺陷的,因为它无法达到碰撞或预像抗性的标准。 对于密码,最好使用迭代密钥派生函数,如Argon2或PDKDF2。 - Kerrmiter
8个回答

90
   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);

大写字母的意义是什么? - Blankman
3
个人喜好问题。这就是为什么我在我的方法中添加了一个参数,以便调用者可以选择。 - Philippe Leybaert
14
当你已经有Convert.ToBase64String()时,不需要重新发明轮子。 - Eric Petroelje
6
Base64字符串更短。它使用了字母表中的所有字母、数字和少量标点符号,因此不是十六进制。Base64对于3个字节使用4个字符,而十六进制字符串对于3个字节使用6个字符。 - Philippe Leybaert
7
@Eric:在某些情况下,Base64不是一个好的选择,因为它使用了额外的标点字符(例如,在 URL 中传递它)。 - Philippe Leybaert
显示剩余2条评论

70

我始终觉得这是最方便的:

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

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

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

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


与@PhilippeLeybaert的解决方案相同,但是在一行中完成。 - sonjz

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

23

如果你支持“Hex偏好”,你可以这样做。这基本上是Philippe Leybaert的答案的最简版本。

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

B1DB2CC0BAEE67EA47CFAEDBF2D747DF


10

由于哈希值可能包含无法在普通字符串中显示的字符,因此最好将其转换为Base64编码的字符串。

string s = Convert.ToBase64String(bytes);

并使用

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

获取字节。


7

你可以使用带有字节和编码的字符串构造函数,但是由于它可能包含许多有趣的字符(空字节,换行符,控制字符等),因此你很难管理该字符串。

最好的方法是使用base64进行编码,以获得易于处理的漂亮字符串:

string s = Convert.ToBase64String(bytes);

要将该字符串转换回字节数组:

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

1

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

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

注:以上代码为IT技术相关内容,Convert.ToBase64String()和Convert.ToHexString()分别是将二进制数据转换成字符串的方法。

0

对于任何感兴趣的人,我创建了一个名为CryptoStringify的Nuget包,它允许您使用简洁明了的语法将字符串转换为哈希字符串,而无需玩弄字节数组:

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

这是一个扩展方法,可用于 HashAlgorithmKeyedHashAlgorithm,因此也适用于 SHA1、HMACSHA1、SHA256 等。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接