.net - HMACSHA1 是为零长度的消息定义的吗?

标签 .net cryptography sha1 hmac

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

对于数据完整性检查,供应商的规范要求 HMAC基于 SHA1,使用根据 RFC2898 从密码派生的 key .许多编程环境都有一个名为 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()

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

有什么提示吗?

最佳答案

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

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

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

关于.net - HMACSHA1 是为零长度的消息定义的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1186251/

相关文章:

c# - : ASP.net 或 WCF 哪个更简单?

c# - 将数据库中的值调用到文本字段中 - 自定义错误

c# - 使用 WCF 服务开发 iOS 应用程序

java - 如何在Java中旋转128位数字

javascript - jsSHA、CryptoJS 和 OpenSSL 库给出不同的结果

php - 拉维尔 5 : Using SHA1 instead of Bcrypt

.net - 带有 .NET 连接器问题的 mySQL 存储过程

ssl - 如何更改本地主机 (XAMPP) 上 TLS 协议(protocol)的密码学方法?

ssl - 导入到根存储中的非自签名证书是否需要(自签名)颁发者也导入到根存储中?

java - 为什么这两个来源计算出不同的 sha-1 和