crypto createHMAC输出根据nodejs版本的不同而不同
在升级我的节点版本时,我遇到了encryption模块问题。 创build的HMAC取决于节点的版本。 您会在下面find重现问题的代码。
如果我将密钥编码为BASE64(或任何),则HMAC不依赖于node.js版本。
如果我把它编码为二进制,如果我改变我的node.js版本,HMAC是不同的。
[编辑]根据为什么crypto.createHash在新版本中返回不同的输出? 调用update
函数时添加了编码
代码片段
"use strict"; const crypto = require('crypto'); console.log(process.version); let key = '5ece799aa73a7a8e687876f8e0eabe2e200b967ef5728d845f72fc9ea27dbcd90cd4e06e8bc90d823ac8a54ce91f68ca37fc2e7bbf3f5ef9d82b4c6b938f1936'; let _key64 = (new Buffer(key, 'hex')).toString('base64'); console.log("B64 KEY: "+crypto.createHmac('sha512', _key64).update("hey", "binary").digest('hex').toUpperCase()); let _keyBin = (new Buffer(key, 'hex')).toString('binary'); console.log("BIN KEY: "+crypto.createHmac('sha512', _keyBin).update("hey", "binary").digest('hex').toUpperCase());
输出是以下两个版本的node.js
v5.6.0 B64 KEY: 0DC11C737E575B17DD575042F8F372E3D63A86C3B56C06FB74C9B0AB8E96A5FC8A2DC33667280DC5B306C93AA3DECBAF0D8EDE56F3666C11BFC25A70CFC027D0 BIN KEY: E5A9F813D9AA64A6791BEA91035553FFC730DBE635D0CE7AC722C0195DFDD77A969323FDDFB4E5054E59073DAE9B9BF00CFF73CF20F2FACEE01F79F25E7B9303 v8.1.4 B64 KEY: 0DC11C737E575B17DD575042F8F372E3D63A86C3B56C06FB74C9B0AB8E96A5FC8A2DC33667280DC5B306C93AA3DECBAF0D8EDE56F3666C11BFC25A70CFC027D0 BIN KEY: 6F089BCA7A24BF6C3F8E0F75349C8B446C4E69336CF41AA7A390C9B17086417E475545197B0312B4D9240A9F0388CA8722ADCF04BFD554321290EBBCD61F800E
注意:这是一个缩小的问题: HMAC根据节点版本(paybox模块)
顺便说一句,如果我这样做
const key = '5ece799aa73a7a8e687876f8e0eabe2e200b967ef5728d845f72fc9ea27dbcd90cd4e06e8bc90d823ac8a54ce91f68ca37fc2e7bbf3f5ef9d82b4c6b938f1936' const bkey = (new Buffer(key, 'hex')).toString('binary'); console.log((new Buffer(bkey, 'binary')).toString('hex'));
没问题,我获得相同的密钥5ece799aa73a7a8e687...
无论节点的版本。
解决感谢@matt:总结他的评论
由于https://github.com/nodejs/node/commit/b010c8716498dca398e61c388859fea92296feb3 ,最好通过删除.toString('binary')
将缓冲区传递给密码
所以这
"use strict"; const crypto = require('crypto'); console.log(process.version); let key = '5ece799aa73a7a8e687876f8e0eabe2e200b967ef5728d845f72fc9ea27dbcd90cd4e06e8bc90d823ac8a54ce91f68ca37fc2e7bbf3f5ef9d82b4c6b938f1936'; let _key64 = (new Buffer(key, 'hex')).toString('base64'); console.log("B64 KEY: "+crypto.createHmac('sha512', _key64).update("hey", "binary").digest('hex').toUpperCase()); let _keyBin = (new Buffer(key, 'hex')); console.log("BIN KEY: "+crypto.createHmac('sha512', _keyBin).update("hey", "binary").digest('hex').toUpperCase());
作品(当然)
v5.6.0 B64 KEY: 0DC11C737E575B17DD575042F8F372E3D63A86C3B56C06FB74C9B0AB8E96A5FC8A2DC33667280DC5B306C93AA3DECBAF0D8EDE56F3666C11BFC25A70CFC027D0 BIN KEY: E5A9F813D9AA64A6791BEA91035553FFC730DBE635D0CE7AC722C0195DFDD77A969323FDDFB4E5054E59073DAE9B9BF00CFF73CF20F2FACEE01F79F25E7B9303 v8.1.4 B64 KEY: 0DC11C737E575B17DD575042F8F372E3D63A86C3B56C06FB74C9B0AB8E96A5FC8A2DC33667280DC5B306C93AA3DECBAF0D8EDE56F3666C11BFC25A70CFC027D0 BIN KEY: E5A9F813D9AA64A6791BEA91035553FFC730DBE635D0CE7AC722C0195DFDD77A969323FDDFB4E5054E59073DAE9B9BF00CFF73CF20F2FACEE01F79F25E7B9303
- validation在NodeJS中使用php crypt()生成的哈希?
- 尝试在node.js中获取AESencryptionstring以匹配.net中的encryption值
- NodeJSencryption:重新使用密码对象来提高性能
- AES-128-GCM在Node V6上validationIV吗?
- Nodejs使用encryption错误解密错误的最终块长度
- 如何在NodeJS中创buildencryption和解密函数?
- 将密码过程从java转换为nodejs(Blowfish)
- 像维基百科上所说的那样实现LLLalgorithm,但却陷入严重的问题
- Amazon S3 POST API以及使用NodeJS签署策略