加密模块不能与最新的节点7.10一起使用

时间:2017-07-25 13:44:52

标签: node.js encoding cryptography node-crypto

以下代码段在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;
}

1 个答案:

答案 0 :(得分:1)

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

我已在this answer中记录了确切原因,但由于该问题与哈希有关,因此我不愿意将您的问题视为副本。

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

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