javascript - 如何在 JS 中创建十六进制编码的 HmacSHA256 安全哈希?
问题描述
我有一个使用以下 Java 代码的项目......
static String generateHashKey (String apiKey, String msg) throws GeneralSecurityException{
Mac hmacSha256 = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKey = new SecretKeySpec(apiKey.getBytes(), "HmacSHA256");
hmacSha256.init(secretKey);
byte[] bytes = hmacSha256.doFinal(msg.getBytes());
return Hex.encodeHexString(bytes).replace("-","");
}
我正在尝试用 js 函数替换它,例如...
import crypto from "crypto";
...
const eMessage = crypto.createHmac("SHA256", apiKey).update(message).digest("base64");
但它似乎产生了不同的哈希值。如何确保两者的哈希值相同?我错过了什么?
更新
根据我尝试过的评论和链接
import crypto from "crypto";
import fs from "fs";
import moment from "moment";
import axios from "axios";
import hmacSHA256 from 'crypto-js/hmac-sha256';
import sha256 from 'crypto-js/sha256';
import Base64 from 'crypto-js/enc-base64';
....
const eMessage = Base64.stringify(hmacSHA256(message, key));
const eMessage2 = crypto.createHmac("SHA256", key).update(message).digest("base64");
console.log(eMessage)
console.log(eMessage2)
两个 JS 库都返回相同的(这很好),但它与不好的 Java 不匹配。
解决方案
所以我遇到的问题是它不在base64中,而是在Hex中......
import hmacSHA256 from 'crypto-js/hmac-sha256';
import sha256 from 'crypto-js/sha256';
import Hex from 'crypto-js/enc-hex'
const bytes = hmacSHA256(message, key);
const eMessage = bytes.toString(Hex);
推荐阅读
- javascript - 如何提取具有最多值的数组的索引——Javascript
- google-sheets - 是否有对每组 7 个单元格求和的函数?
- html - 好的,html4 框架是“过时的”,但是如果不完全重写您的网站,似乎没有一种替代方法。或者有吗?
- image - svg 的路径不适用于 Gatsby 中的 img 标签
- render - 虚幻引擎电影远程渲染
- git - Github - 使用我的本地文件使 master 分支保持最新?
- sails.js - 我在哪里可以找到添加到 Sails.js 应用程序的依赖项,例如 Vue.js、Vuetify 和 lodash?
- python - 如果与另一个数组连接,为什么布尔值的 numpy 数组会变为整数?
- material-ui - Uno 材质底部导航栏
- delphi - 使表单无效会使其中的所有控件失效吗?