为什么哈希函数(SHA256)输出的字符串的位数会波动?

Why does the bit count of a string output from a hashing function (SHA256) fluctuate?

我想我对字符串的位数是如何工作的有一个核心误解,希望有人能帮我解决这个问题。

我正在尝试确定用于存储从 SHA256 派生的密钥的最佳 SQL 服务器数据类型。那里的答案差异很大,我想在匆忙实施 SO 答案之前真正理解这个主题。

我做了一个 .NET Fiddle 来测试检查各种 SHA256 哈希的长度和位数,但我得到的结果不一致。位数在 294-303 左右波动,而我认为它应该始终为 256。我计算的位数有误吗?我用于验证我需要的 SQL 数据类型的方法是否存在缺陷? char(32) 在纸面上似乎有意义(256 位除以每个字符 8 位 = 32),但哈希的实际字符串长度为 44,所以我很困惑。任何见解将不胜感激。

你数错了。您的问题实际上是关于您的 GetBits() 方法的:

public static string GetBits(string input)
{
    StringBuilder sb = new StringBuilder();
    foreach (byte b in Encoding.ASCII.GetBytes(input))
    {
        sb.Append(Convert.ToString(b, 2));
    }

    return sb.ToString();
}

您将其输入一个 base64 字符串并取回位。问题是:这个 Convert.ToString(b, 2) 省略了导致您看到的差异的前导零:

  • 'A': (0)1000001
  • '0': (00)110000

所以有些字符被报告为有 6 位,有些有 7 位。散列最终是一个字节数组,这是固定长度:32,乘以 8 = 256。散列有时是 base64 编码以确保安全存储和传输。这会增加大小,因为字符的熵较小。

32字节的数据,base64编码后,最多44个字符。