当信息中出现新行时,HMAC SHA-256是不正确的。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当信息中出现新行时,HMAC SHA-256是不正确的。相关的知识,希望对你有一定的参考价值。

我正在使用下面的代码来产生一个HMAC。

import javax.crypto.{Mac, SecretKey}

def hmac(key: String, data: String): String = {
  val algo = "HmacSHA256"
  val keySpec = new SecretKeySpec(key.getBytes("UTF-8"), algo)
  val mac = Mac.getInstance(algo)
  mac.init(keySpec)
  toHexString(mac.doFinal(data.getBytes("UTF-8")))
}

def toHexString(bytes: Array[Byte]): String = {
  val hexBuffer = new StringBuffer()

  bytes.foreach { byte =>
    val hex = Integer.toHexString(0xff & byte)
    if (hex.length == 1) hexBuffer.append('0')
    hexBuffer.append(hex)
  }

  hexBuffer.toString
}

我从互联网上找到的java例子中借来的。

它对我试过的任何数据都能产生正确的结果,只要我签署的数据中没有换行。

我一直在使用这个工具来验证我的哈希值。https: /www.freeformatter.comhmac-generator.html

我使用链接的hmac生成器的输出来创建这两个测试用例。

assert(hmac("key", "data") === "5031fe3d989c6d1537a013fa6e739da23463fdaec3b70137d828e36ace221bd0")

assert(hmac("key", "data
data") === "8e64d91f963cf37ccae4768f7546494dd00b362f53a94853f629359c4e47c5e2")

第一个测试用例通过了,但第二个测试用例失败了,原因是 hmac 生产。7ec5edf61abbc95f15ffee94ce47ab8889c6d35e7d04ea2924f6b70e55e31acf.

我用各种单行和多行字符串进行了测试,AFAICT当有换行时总是错误的,而当它是单行时总是正确的。

我到底做错了什么?

答案

你可以看到它需要 在java中。的 回车

以下是我运行并获得成功的结果

enter image description here

而两行数据的网站字符串如下图所示

enter image description here

另一答案

你应该使用官方的NIST测试向量来验证,而不是随机网站上的结果。

链接与NIST的测试向量。http:/csrc.nist.govgroupsSTMcavpdocumentsmachmactestvectors.zip。

HMAC-SHA256应该是该压缩文件中L=32的那些。

更多细节信息在这里:这个来自Security StackExchange的问题有正确的信息。

https:/security.stackexchange.comquestions38411nist-test-vectors-for-hmac-sha-256。

以上是关于当信息中出现新行时,HMAC SHA-256是不正确的。的主要内容,如果未能解决你的问题,请参考以下文章

Python JWT 库 PyJWT 使用 HS256 签名时遇到问题 - 使用 SHA-256 哈希算法的 HMAC

在 Ruby 中使用 HMAC SHA256

hmac-sha256 2021-11-02

在HMAC SHA256中编码字符串[关闭]

[Python中具有SHA256的base64 HMAC

在 php 中使用 SHA256 hmac 生成散列消息(key & msg 是假的)