0

我不熟悉散列算法以及使用它们时相关的风险,因此对我在上一个问题中收到的以下答案有疑问。. .

基于哈希值在编码为 ASCII 时必须适合 16 个 ASCI 字符的注释,解决方案是首先选择一些加密哈希函数(SHA-2 系列包括 SHA-256、SHA-384 和 SHA- 512)然后,将所选散列函数的输出截断为 96 位(12 个字节)——即保留散列函数输出的前 12 个字节并丢弃剩余的字节,然后对截断的输出进行 base-64 编码到 16 个 ASCII 字符(128 位),有效地产生 96 位强加密散列。

如果我将 base-64 编码的字符串子串为 16 个字符,那么保留散列函数的前 12 个字节,然后对它们进行 base-64 编码,这是根本不同的吗?如果是这样,有人可以解释(提供示例代码)截断字节数组吗?

我针对 36,000 多个不同的值测试了完整哈希值的子字符串,并且没有发生冲突。下面的代码是我当前的实现。

感谢您提供的任何帮助(和清晰度)。

public static byte[] CreateSha256Hash(string data)
{
    byte[] dataToHash = (new UnicodeEncoding()).GetBytes(data);
    SHA256 shaM = new SHA256Managed();
    byte[] hashedData = shaM.ComputeHash(dataToHash);

    return hashedData;
}

public override void InputBuffer_ProcessInputRow(InputBufferBuffer Row)
{
    byte[] hashedData = CreateSha256Hash(Row.HashString);

    string s = Convert.ToBase64String(hashedData, Base64FormattingOptions.None);

    Row.HashValue = s.Substring(0, 16);


}

[原帖] (http://stackoverflow.com/questions/4340471/is-there-a-hash-algorithm-that-produces-a-hash-size-of-64-bits-in-c)

4

2 回答 2

1

不,没有区别。但是,只获取数组前 12 个字节的 base64 字符串会更容易,而不是截断数组:

public override void InputBuffer_ProcessInputRow(InputBufferBuffer Row) {

    byte[] hashedData = CreateSha256Hash(Row.HashString);

    Row.HashValue = Convert.ToBase64String(hashedData, 0, 12);

}

base 64 编码只是在每个字符中放置 6 位,因此 3 个字节(24 位)变成 4 个字符。只要您在偶数 3 字节边界处拆分数据,就与在偶数 4 个字符边界处拆分字符串相同。

如果您尝试在这些边界之间拆分数据,base64 字符串将被填充数据填充到下一个边界,因此结果将不一样。

于 2010-12-20T22:11:41.460 回答
0

截断就像Take(12)在此处添加一样简单:

改变

 byte[] hashedData = CreateSha256Hash(Row.HashString);

到:

 byte[] hashedData = CreateSha256Hash(Row.HashString).Take(12).ToArray();
于 2010-12-20T22:15:35.867 回答