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

Bla*_*man 72 c# hash md5 cryptography cryptographic-hash-function

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

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

using (MD5 md5 = MD5.Create())
{
    byte[] byteHashedPassword = md5.ComputeHash(bytePassword);
} 
Run Code Online (Sandbox Code Playgroud)

我需要转换byteHashedPassword为字符串.

Phi*_*ert 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();
    }
Run Code Online (Sandbox Code Playgroud)

然后,您可以将其称为扩展方法:

string hexString = byteArray.ToHex(false);
Run Code Online (Sandbox Code Playgroud)

  • 当你已经拥有`Convert.ToBase64String()`时,无需重新发明轮子 (9认同)
  • Base64字符串更短.它使用字母表中的所有字母,数字和一些标点字符,因此它不是十六进制的.Base64使用4个字符表示3个字节,而十六进制字符串使用6个字符表示3个字节. (5认同)
  • @Eric:有些情况下Base64不是一个好选择,因为使用了额外的标点字符(例如在URL中传递) (4认同)
  • 一个偏好的问题.这就是为什么我在我的方法中添加了一个参数,所以调用者可以选择 (3认同)

Gra*_*rdx 63

我总觉得这是最方便的:

string hashPassword = BitConverter.ToString(byteHashedPassword).Replace("-","");
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,如果您将此作为紧密循环和许多操作,这可能会很昂贵,因为至少有两个隐式字符串强制转换和调整大小.


Dav*_*vid 24

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


Sim*_*ver 17

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

string.Concat(hash.Select(x => x.ToString("X2")))
Run Code Online (Sandbox Code Playgroud)

B1DB2CC0BAEE67EA47CFAEDBF2D747DF


Axe*_*ger 8

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

string s = Convert.ToBase64String(bytes);
Run Code Online (Sandbox Code Playgroud)

并使用

byte[] bytes = Convert.FromBase64(s);
Run Code Online (Sandbox Code Playgroud)

获取字节数.


Eri*_*lje 7

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

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

string s = Convert.ToBase64String(bytes);
Run Code Online (Sandbox Code Playgroud)

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

byte[] bytes = Convert.FromBase64String(s);
Run Code Online (Sandbox Code Playgroud)