2009-07-27 78 views
1

我有一个边缘案例。我构建的代码可以读取由商业封闭源代码工具生成的二进制数据文件。有关数据格式的信息在文档中指定。是为零长度的消息定义的HMACSHA1?

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

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

但是,当数据流的长度为零时,供应商的工具发出的散列并非全为零。如果没有消息通过HMACSHA1运行,我不知道它来自哪里。

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

我使用.NET和类System.Security.Cryptography.HMACSHA1,虽然我相信我的问题是平台不可知的。


有一个特定的平台位:当我试图得到该类型的实例的哈希属性,如果我没有通过实例上运行的任何数据,我得到

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

这对我来说根本就不奇怪,因为没有什么值得一提的。

任何提示?

回答

3

在黑暗中徘徊,我找到了我需要的东西。 不确定HMACSHA1是否定义为零长度消息的情况,但是

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

对不起,我们现在回到你以前安排的节目。

+0

这意味着HMACSHA1被定义为长度为零的消息,但不是未定义的(空)消息。如预期。 – 2009-07-27 04:45:56

1

必须尝试向散列添加一个零长度的数组?底层对象可能在第一次调用时创建。

使用若干实现散列一个零长度文件给出:

MD5 : d41d8cd98f00b204e9800998ecf8427e 
SHA-1 : da39a3ee5e6b4b0d3255bfef95601890afd80709 
+0

HMACSHA1需要一个您尚未指定的密钥。我遵守的实现也使用Salt。所以你给的实际哈希值并不是很有用。 – Cheeso 2009-07-27 05:50:38

+0

哎呀,半睡着了,没有正确地读这个问题。这些是直的MD5/SHA1哈希值,而不是HMAC。 – devstuff 2009-07-28 02:05:22

4

HMACSHA1为n位的所有输入所定义,其中0 < = N < 2^20 - 160

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

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