首页 > 解决方案 > 当消息中存在换行符时,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.com/hmac-generator.html

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

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

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

第一个测试用例通过但第二个测试用例失败,因为hmac产生:7ec5edf61abbc95f15ffee94ce47ab8889c6d35e7d04ea2924f6b70e55e31acf

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

我究竟做错了什么?

标签: javascalasha256hmac

解决方案


\r\n你可以在java中看到它的需要。回车_

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

在此处输入图像描述

两行数据的网站字符串如下

在此处输入图像描述


推荐阅读