加密模块不适用于最新的节点 7.10

Crypto module is not working with latest node 7.10

以下代码片段适用于 Node 0.12.18(将 Buffer.from 替换为 new Buffer),但不适用于最新的 Node 版本 (7.10.0)

谁能解释一下为什么会这样??以下代码中缺少任何内容。

/* Node.js */
var crypto = require('crypto');

var algorithm = 'aes-256-ctr';

var data  = "Dhanet-Kalan-Chittorgarh"
var encryption_key = "VHUz1dxrhsowwEYGqUnPcE4wvAyz7Vmb";

var encryption_data = _encrypt()

console.log('data for encryption :: ' + data);
console.log('encrypted data :: ' + encryption_data);
console.log('decrypted data :: ' + _decrypt(encryption_data));

function _decrypt(_encryption_data){

    var decipher, dec, chunks, itr_str;

    // remove itr string
    itr_str = _encryption_data.substring(_encryption_data.length-24);
    _encryption_data = _encryption_data.substring(0, _encryption_data.length-24);

    decipher = crypto.createDecipheriv(algorithm, encryption_key, Buffer.from(itr_str, "base64"));
    chunks = []
    chunks.push( decipher.update( Buffer.from(_encryption_data, "base64").toString("binary")) );
    chunks.push( decipher.final('binary') );
    dec = chunks.join("");
    dec = Buffer.from(dec, "binary").toString("utf-8");

    return dec;
}


function _encrypt(){

    //random alpha-numeric string
    var itr_str = Buffer.from(randomString(16)).toString('base64') ; // "3V5eo6XrkTtDFMz2QrF3og==";

    var cipher = crypto.createCipheriv(algorithm, encryption_key, Buffer.from(itr_str, "base64"));
    var chunks = [];
    chunks.push(cipher.update( Buffer.from(data), 'utf8', 'base64'));
    chunks.push(cipher.final('base64'));

    var crypted = chunks.join('');
    crypted = crypted.concat(itr_str);

    return crypted;
}

function randomString(len, an)
{
    an = an&&an.toLowerCase();
    var str="", i=0, min=an=="a"?10:0, max=an=="n"?10:62;
    for(;i++<len;){
        var r = Math.random()*(max-min)+min <<0;
        str += String.fromCharCode(r+=r>9?r<36?55:61:48);
    }
    return str;
}

Node.js v6 对 crypto 引入了一些向后不兼容的更改,这些更改导致了这种情况。

我已经在 中记录了确切的原因,但由于该问题与哈希相关,我不愿意将您的问题作为重复问题关闭。

但修复方法类似(您需要将 binary 作为 decipher.update() 的编码传递,否则它将默认为 utf-8):

chunks.push( decipher.update( Buffer.from(_encryption_data, "base64"), 'binary') );