我不熟悉哈希算法和使用它们时相关的风险,因此在下面收到的答案上有一个问题。 。 。

基于评论,即在编码为ASCII时必须拟合16个ASCI字符时,该解决方案首先是选择一些加密哈希函数(SHA-2家族包括SHA-256,SHA-384和SHA-- 512)然后,要将所选哈希函数的输出截断为96位(12个字节) - 也就是说,保持哈希函数输出的前12个字节然后丢弃其余的字节,然后丢弃base-64-base-64-base-64-incoded thuncunced Outpot 16个ASCII字符(128位)有效地产生了96位的密码哈希。

如果我将基本-64编码的字符串划分为16个字符是根本上不同的,那么请保留哈希函数的前12个字节,然后将基础-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-there-a-hash-algorithm-that-produces-a-a-hash-hash-size of-64-bits-in-c)

有帮助吗?

解决方案

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

public override void InputBuffer_ProcessInputRow(InputBufferBuffer Row) {

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

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

}

基本64编码仅在每个字符中放置6位,因此3个字节(24位)分为4个字符。只要您在3个字节边界处将数据分配,那就与在4个字符边界上分配字符串相同。

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

其他提示

截断与添加一样容易 Take(12) 这里:

改变

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

至:

 byte[] hashedData = CreateSha256Hash(Row.HashString).Take(12).ToArray();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top