在 Node.js 中我使用以下代码
hash = crypto.createHmac('sha256', SECRET).update(fileContent).digest('hex');
计算 HMAC。 C++/Qt 代码模拟
QByteArray hash = QMessageAuthenticationCode::hash(
fileContent, SECRET, QCryptographicHash::Sha256).toHex();
生成与 Node.JS 中文本 JSON 文件内容相同的结果。然而,Linux 命令行 HMAC 计算会产生不同的哈希码:
> openssl sha256 -hmac "SECRET" filename
命令行有什么问题?什么是正确的openssl
论点?
答案1
如果您提供相同的输入,这两个命令将给出相同的结果。如果你得到不同的输出,那么你的工具之一有错误(这不太可能)或者你没有传递相同的输入。注意:
- 应该
SECRET
是随机生成的密钥。该密钥的每个字节有 1/256 的机会为 0。您不能在命令行上传递空字节。 - HMAC的输入是一串字节。如果 JavaScript 代码将输入读取为文本并更改其编码或修改其空格,则会产生不同的 MAC。
- 特别是,检查您是否没有添加或删除尾随换行符。
- 特别是,请检查 Unix 和 Windows 行结尾之间是否未发生更改。