如何转换散列的结果,这是一个字节数组,为一个字符串?

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

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

我需要byteHashedPassword转换为字符串。

有帮助吗?

解决方案

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

其他提示

我总是发现这是最方便的:

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

有关一些奇怪的原因BitConverter喜欢把字节之间破折号,所以替换只是删除它们。

更新: 如果你喜欢“小写”六角,只是做一个.ToLower()和繁荣。

请注意,如果你正在做这个作为一个紧密循环和许多老年退休金计划,因为至少有两个隐含的字符串蒙上并调整回事,这可能是昂贵的。

可以使用Convert.ToBase64StringConvert.FromBase64String容易地字节数组转换成字符串。

如果您在“十六进制偏好”阵营是可以做到这一点。这基本上是由Philippe Leybaert答案的最小版本。

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

B1DB2CC0BAEE67EA47CFAEDBF2D747DF

好,因为它是一个哈希值,它有不能在正常的字符串被显示可能的值,所以最好的办法是将其转换为Base64编码的字符串。

string s = Convert.ToBase64String(bytes);

和使用

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

,以获得字节后面。

那么,你可以使用字符串构造函数,字节和编码,但你可能会得到一个难以管理串出的,由于它可能包含很多有趣的字符(空字节,换行,控制字符等)

要做到这一点,最好的办法是与基地64编码它得到一个不错的字符串,很容易一起工作:

string s = Convert.ToBase64String(bytes);

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

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

对于任何有兴趣的一个NuGet包我创建了名为 CryptoStringify 允许您使用一个干净的语法,将字符串转换为一个散列字符串,而不必玩弄字节数组:

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

这是对HashAlgorithmKeyedHashAlgorithm扩展方法,以便工作在SHA1,HMACSHA1,SHA256等太

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top