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


76

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

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

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

我需要转换byteHashedPassword为字符串。

Answers:


81
   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
优先事项。这就是为什么我添加了一个参数,我的方法,所以调用者可以选择
菲利普Leybaert

9
无需推倒重来,当你已经有了Convert.ToBase64String()
埃里克Petroelje

5
Base64字符串较短。它使用字母,数字和一些标点符号的所有字母,因此不是十六进制。Base64使用3个字节的4个字符,而十六进制字符串使用3个字节的6个字符。
Philippe Leybaert

4
@Eric:在某些情况下,由于使用了额外的标点符号(例如在URL中传递),Base64不是一个很好的选择
Philippe Leybaert 2010年

65

我总是觉得这是最方便的:

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

出于某种奇怪的原因,BitConverter喜欢将破折号放在字节之间,因此替换操作将其删除。

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

请注意,如果您这样做是一个紧密循环,并且很多操作可能会很昂贵,因为至少要进行两次隐式字符串强制转换和调整大小。


与@PhilippeLeybaert解决方案相同,只是一行。
sonjz 2013年

28

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


18

如果您处于“十六进制偏好”阵营,则可以执行此操作。这基本上是Philippe Leybaert的答案的最低版本。

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

B1DB2CC0BAEE67EA47CFAEDBF2D747DF


9

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

string s = Convert.ToBase64String(bytes);

和使用

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

取回字节。


4

好吧,您可以使用需要字节和编码的字符串构造函数,但是由于其中可能包含很多有趣的字符(空字节,换行符,控制字符等),因此可能很难管理字符串。

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

string s = Convert.ToBase64String(bytes);

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

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

0

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

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

它是一种扩展方法HashAlgorithmKeyedHashAlgorithm因此也可以在SHA1,HMACSHA1,SHA256等上使用。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.