1

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

对于数据完整性检查,供应商的规范要求使用基于 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()

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

任何提示?

4

3 回答 3

4

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

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

所以 HMACSHA1( "empty string" ) = SHA1( K*|| SHA1( K**) ),这是非常明确的。

于 2009-07-27T10:48:05.683 回答
3

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

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

抱歉打扰了,我们现在让您回到之前安排的节目。

于 2009-07-27T03:14:19.263 回答
1

必须尝试将零长度数组添加到散列?底层对象可能是在第一次调用期间创建的。

使用几种实现散列零长度文件给出:

MD5   : d41d8cd98f00b204e9800998ecf8427e
SHA-1 : da39a3ee5e6b4b0d3255bfef95601890afd80709
于 2009-07-27T03:19:02.657 回答