【问题标题】:SHA256 giving 44 length output instead 64 lengthSHA256 给出 44 长度输出而不是 64 长度
【发布时间】:2019-09-13 13:37:08
【问题描述】:

我正在使用以下代码来执行 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。

有什么问题?较短的输出长度会影响安全性吗?

【问题讨论】:

  • 作为一种猜测 - 看起来你正在将其转换为 Base64 字符串而不是标准的十六进制字符串 - 这会给出不同的长度。
  • SHA256 会给你 32 个字节的哈希值。使用 Base64 编码可以得到大约 44 个字符。正如@origin 所说,如果您将每个字节表示为其十六进制值(2 个字符),那么您将获得 64 个字符。
  • 是的,我认为它是正确的。我已将每个字节转换为 X2 格式的字符串,长度为 64。

标签: c# sha256


【解决方案1】:

Base-64 是每个字符 6 位 (2^6 = 64)。

256 bits / 6 bits per char = 42.6666 char

显然,由于填充,最终结果为 44(您将在输出的末尾看到一或两个 =)。

您必须期待 base-16(AKA 十六进制),即每个字符 4 位 (2^4 = 16)。

256 bits / 4 bits per char = 64 char

十六进制使用this:

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

【讨论】:

  • 使用这种方式和Base64方式在安全性上有什么区别吗?
  • 不,它们都只是编码。任何拥有 base 64 或 base 16 信息的人都可以轻松返回原始二进制表示。
猜你喜欢
  • 2021-08-10
  • 1970-01-01
  • 2018-12-12
  • 2022-01-10
  • 2016-08-13
  • 2018-09-17
  • 2021-06-12
  • 2021-10-28
  • 1970-01-01
相关资源
最近更新 更多