我不熟悉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)
答案 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();