java - 当消息中存在换行符时,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 对此进行了测试,当有换行符时它总是错误的,而当它是单行时它总是正确的。
我究竟做错了什么?
解决方案
推荐阅读
- typescript - 将对象列表转换为记录类型
- .htaccess - 如何使用 .htaccess 阻止特定图像?
- java - 如何将通过 Spring Boot 创建的图像发送到我的网站?
- node.js - 如何在 Express 中向客户端返回错误消息对象?
- intellij-idea - Intellij打开文件/打开类弹出缓慢完成搜索
- r - 从 R 中的 alphaadvantage 获取符号
- javascript - 在 Vue Router 中添加 Global Route Guards 后,URL 将不再更新
- codenameone - 如何自定义 PullToRefresh 以支持一个小拉动和另一个长拉动的动作?
- r - r中的多个条件
- python - 如何将日志放入mysql表?