SHA256输出结果长度为44而不是64

9

我正在使用以下代码执行SHA256。

public static string GenerateSaltedHash(string plainTextString, string saltString)        
        {            
            byte[] salt = Encoding.UTF8.GetBytes(saltString);
            byte[] plainText = Encoding.UTF8.GetBytes(plainTextString);
            HashAlgorithm algorithm = new SHA256Managed();

            byte[] plainTextWithSaltBytes =
              new byte[plainText.Length + salt.Length];

            for (int i = 0; i < plainText.Length; i++)
            {
                plainTextWithSaltBytes[i] = plainText[i];
            }
            for (int i = 0; i < salt.Length; i++)
            {
                plainTextWithSaltBytes[plainText.Length + i] = salt[i];
            }
            byte[] bytes = algorithm.ComputeHash(plainTextWithSaltBytes);
            return Convert.ToBase64String(algorithm.ComputeHash(plainTextWithSaltBytes));                              
        }

因为我使用的是SHA256,所以我期望结果长度为64。但实际上我得到的是44。

问题出在哪里?较短的输出长度会影响安全性吗?


2
猜测您正在将其转换为Base64字符串而不是标准的十六进制字符串,这将导致长度不同。 - Origin
1
SHA256会给你32个字节的哈希值。使用Base64编码,可以得到大约44个字符。正如@origin所说,如果你代表每个字节的十六进制值(2个字符),那么你将得到64个字符。 - Simon Halsey
是的,我认为这是正确的。我已经使用X2格式将每个字节转换为字符串,并且我得到了长度为64。 - Mangesh Kulkarni
1个回答

18

Base-64每个字符占6位(2的6次方等于64)。

256 bits / 6 bits per char = 42.6666 char

由于填充,显然结果变成了44(你会在输出的末尾看到一个或两个=)。

你肯定期望使用16进制(即十六进制),每个字符占用4位(2^4=16)。

256 bits / 4 bits per char = 64 char

对于十六进制,请使用这个

return BitConverter.ToString(bytes).Replace("-", string.Empty);

使用这种方法和Base64方法是否存在安全上的差异? - Dalton
1
不,它们只是编码方式。任何拥有Base64或Base16信息的人都可以轻松地恢复到原始的二进制表示形式。 - weston

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