.net HMAC-SHA1中TransformBlock和ComputeHash方法的哈希代码不同

.net HMAC-SHA1中TransformBlock和ComputeHash方法的哈希代码不同,.net,encryption,hmacsha1,.net,Encryption,Hmacsha1,当我对缓冲区使用TransformBlock和TransformFinalBlock时,哈希代码不同于在HMAC-SHA1中使用ComputeHash()方法计算哈希代码。为什么?以及如何解决这个问题。因为你没有提供任何代码,所以不可能确定,但是心理调试说你假设TransformFinalBlock返回了HMAC,它只是将一个值计算到散列属性中 byte[] data = { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 }; HMACSHA1 hmac = new HMAC

当我对缓冲区使用TransformBlock和TransformFinalBlock时,哈希代码不同于在HMAC-SHA1中使用ComputeHash()方法计算哈希代码。为什么?以及如何解决这个问题。

因为你没有提供任何代码,所以不可能确定,但是心理调试说你假设
TransformFinalBlock
返回了HMAC,它只是将一个值计算到
散列
属性中

byte[] data = { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 };
HMACSHA1 hmac = new HMACSHA1(new byte[] { 1, 2, 3, 4, 5 });
Console.WriteLine($"ComputeHash: {Convert.ToBase64String(hmac.ComputeHash(data))}");
Console.WriteLine($"TransformFinalBlock: {Convert.ToBase64String(hmac.TransformFinalBlock(data, 0, data.Length))}");
Console.WriteLine($"get_Hash: {Convert.ToBase64String(hmac.Hash)}");
输出

ComputeHash: 3J86gFtyUDTwqyZdY8dgBPAyL6Q=
TransformFinalBlock: AQECAwUIDRUiNw==
get_Hash: 3J86gFtyUDTwqyZdY8dgBPAyL6Q=
因此,答案是忽略TransformFinalBlock的结果(它回显输入),然后调用get_Hash。

根据HMACSHA1将密钥与输入消息混合,以生成最终的Hash,然后再次混合和散列

如果您不提供密钥,它将随机生成,这将导致不同的散列

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Security.Cryptography;
using System.Text;

[TestClass]
public class HashTests
{
    [TestMethod]
    public void HashTest()
    {
        var keyBytes = Encoding.UTF32.GetBytes("my secret key");
        var textBytes = Encoding.UTF32.GetBytes("my tiny little text");

        var hash1 = GetHash1(textBytes, keyBytes);
        var hash2 = GetHash2(textBytes, keyBytes);

        Assert.AreEqual(hash1.Length, hash2.Length);

        for (int i = 0; i < hash1.Length; i++)
            Assert.AreEqual(hash1[i], hash2[i]);
    }

    private byte[] GetHash2(byte[] textBytes, byte[] key)
    {
        using (var alg = new HMACSHA1(key))
            return alg.ComputeHash(textBytes);
    }

    private byte[] GetHash1(byte[] input, byte[] key)
    {
        var size = input.Length;
        using (var alg = new HMACSHA1(key))
        {
            int offset = 0;

            while (input.Length - offset >= size)
                offset += alg.TransformBlock(input, offset, size, input, offset);

            alg.TransformFinalBlock(input, offset, size - offset);
            return alg.Hash;
        }
    }
}
使用Microsoft.VisualStudio.TestTools.UnitTesting;
使用System.Security.Cryptography;
使用系统文本;
[测试类]
公共类哈希测试
{
[测试方法]
publicsvoidhashtest()
{
var keyBytes=Encoding.UTF32.GetBytes(“我的密钥”);
var textBytes=Encoding.UTF32.GetBytes(“我的小文本”);
var hash1=GetHash1(textBytes,keyBytes);
var hash2=GetHash2(textBytes,keyBytes);
arenequal(hash1.Length,hash2.Length);
for(int i=0;i=大小)
偏移量+=alg.TransformBlock(输入、偏移量、大小、输入、偏移量);
alg.TransformFinalBlock(输入、偏移、大小-偏移);
返回alg.Hash;
}
}
}

欢迎使用堆栈溢出!如果您的代码有问题,那么您应该提供一个示例来演示您的问题。帮助我们帮助你,不要浪费时间去猜测。另外,不要提供指向代码的链接。相反,您的问题应该包含代码。链接一直断开,如果断开,此问题将失去所有价值。您之前已经问过相同的问题()。请更具体地说明你在问什么,你想做什么。我再次建议使用可靠的加密实现。