将md5散列字节数组转换为字符串

时间:2010-03-12 20:35:44

标签: c# hash cryptography md5 cryptographic-hash-function

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

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

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

我需要将byteHashedPassword转换为字符串。

7 个答案:

答案 0 :(得分:74)

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

答案 1 :(得分:62)

我总觉得这是最方便的:

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

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

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

请注意,如果你这样做是一个紧凑的循环和许多操作,这可能是昂贵的,因为至少有两个隐式字符串强制转换和调整大小继续。

答案 2 :(得分:23)

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

答案 3 :(得分:17)

如果你在'Hex偏好'训练营,你可以这样做。这基本上是Philippe Leybaert答案的最小版本。

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

B1DB2CC0BAEE67EA47CFAEDBF2D747DF

答案 4 :(得分:8)

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

string s = Convert.ToBase64String(bytes);

并使用

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

获取字节。

答案 5 :(得分:3)

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

执行此操作的最佳方法是使用base 64对其进行编码,以获得易于使用的漂亮字符串:

string s = Convert.ToBase64String(bytes);

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

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

答案 6 :(得分:0)

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

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

这是HashAlgorithmKeyedHashAlgorithm的扩展方法,因此也适用于SHA1,HMACSHA1,SHA256等。

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