2017-08-06 30 views
2

我在升級我的節點版本時遇到加密模塊問題。創建的HMAC取決於節點的版本。您會在下面找到重現問題的代碼。加密createHMAC輸出根據nodejs版本不同

如果我將密鑰編碼爲BASE64(或任何),則HMAC不依賴於node.js版本。

如果我將它編碼爲二進制,如果我更改我的node.js版本,HMAC是不同的。

[編輯]根據Why crypto.createHash returns different output in new version?調用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()); 

的輸出與2個版本的node.js的下面我已經添加了編碼

v5.6.0 
B64 KEY: 0DC11C737E575B17DD575042F8F372E3D63A86C3B56C06FB74C9B0AB8E96A5FC8A2DC33667280DC5B306C93AA3DECBAF0D8EDE56F3666C11BFC25A70CFC027D0 
BIN KEY: E5A9F813D9AA64A6791BEA91035553FFC730DBE635D0CE7AC722C0195DFDD77A969323FDDFB4E5054E59073DAE9B9BF00CFF73CF20F2FACEE01F79F25E7B9303 
v8.1.4 
B64 KEY: 0DC11C737E575B17DD575042F8F372E3D63A86C3B56C06FB74C9B0AB8E96A5FC8A2DC33667280DC5B306C93AA3DECBAF0D8EDE56F3666C11BFC25A70CFC027D0 
BIN KEY: 6F089BCA7A24BF6C3F8E0F75349C8B446C4E69336CF41AA7A390C9B17086417E475545197B0312B4D9240A9F0388CA8722ADCF04BFD554321290EBBCD61F800E 

注意:這是一個縮小的問題:HMAC changes according to node version (paybox module)

順便說一句,如果我做

const key = '5ece799aa73a7a8e687876f8e0eabe2e200b967ef5728d845f72fc9ea27dbcd90cd4e06e8bc90d823ac8a54ce91f68ca37fc2e7bbf3f5ef9d82b4c6b938f1936' 
const bkey = (new Buffer(key, 'hex')).toString('binary'); 
console.log((new Buffer(bkey, 'binary')).toString('hex')); 

沒問題,我得到了相同的密鑰5ece799aa73a7a8e687...節點的任何版本。

+0

這給出了同樣的結果,如果我陳ge'「BIN KEY:....更新(」hey「)到'」BIN KEY:.... update(「hey」,「utf-8」)'回答https:// stackoverflow中的註釋.com/questions/45530779/hmac-changes-according-to-node-version-paybox-module –

+0

嘗試並進一步縮小範圍。你用這兩種方法編碼東西等。您應該將該*的結果作爲二進制*進行比較,例如在兩個運行時間的運行之間重新編碼爲十六進制。哈希算法本身不太可能,但PHP和JavaScript再也不會令我驚歎。 –

+0

@MaartenBodewes我建議在問題(底部)中添加縮小範圍。傳遞的緩衝區似乎是一致的,因爲十六進制 - >二進制 - >十六進制是穩定的。神祕仍然存在 –

回答

0

解決了感謝@馬特:總結他的評論

由於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 
相關問題