截断字节数组与子字符串来自SHA-256的编码字符串

时间:2010-12-20 22:01:52

标签: c# hash bytearray sha256

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

  

基于注释,哈希值在编码为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)

2 个答案:

答案 0 :(得分: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字符串将使用填充数据填充到下一个边界,因此结果将不同。

答案 1 :(得分:0)

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

更改

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

要:

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