是否为零长度的消息定义了HMACSHA1?

时间:2009-07-27 03:06:38

标签: .net cryptography sha1 hmac

我有一个边缘案例。我正在构建读取由商业闭源工具生成的二进制数据文件的代码。有关数据格式的信息在文档中指定。

对于数据完整性检查,供应商的规范基于SHA1调用HMAC,使用根据RFC2898从密码派生的密钥。许多编程环境都有一个名为HMACSHA1的类来生成这些哈希值。

对于非零长度的数据流,我可以成功计算Hash,并且我的代码中的计算与供应商的实现一致。换句话说,我的代码可以读取和验证供应商编写的文件,反之亦然。

但是,当数据流的长度为零时,供应商的工具会发出一个并非全为零的哈希值。如果没有消息通过HMACSHA1,我不知道它来自何处。

对于HMACSHA1或任何HMAC,是否为“空消息”的边缘情况定义了MAC?

我正在使用.NET和类System.Security.Cryptography.HMACSHA1,尽管我认为我的问题与平台无关。


有一个特定于平台的位:当我尝试在该类型的实例上获取Hash属性时,如果我没有通过实例运行任何数据,那么我得到

Exception: System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Security.Cryptography.HashAlgorithm.get_Hash()

这对我来说并不奇怪,因为没有什么可以散列的。

任何提示?

3 个答案:

答案 0 :(得分:4)

HMACSHA1是针对n位的所有输入定义的,其中0 <= n <1。 2 ^ 20 - 160。

HMACSHA1定义为SHA1(K* || SHA1(K** || text)),其中K*K**是从密钥派生的20个字节长的值(见FIPS 198a)。

所以HMACSHA1(“空字符串”)= SHA1(K* || SHA1(K**)),这是非常明确的。

答案 1 :(得分:3)

在黑暗中翻滚,我找到了我需要的东西。 不确定是否针对零长度消息定义了HMACSHA1,但是

我确实在.NET上发现,如果我调用HMACSHA1.ComputeHash()并传递长度为零的字节数组,我会得到预期的所需哈希值。

对不起噪音,我们现在返回您之前安排的节目。

答案 2 :(得分:1)

必须尝试在哈希中添加零长度数组吗?底层对象可能是在第一次调用期间创建的。

使用散列零长度文件的几个实现提供:

MD5   : d41d8cd98f00b204e9800998ecf8427e
SHA-1 : da39a3ee5e6b4b0d3255bfef95601890afd80709