Node.js加密投掷错误

时间:2014-05-13 14:41:30

标签: node.js cryptography

以下代码给出了错误的解密错误

vaultEngine.AESDecrypt = function (encKey, data) {
    var cipherObject = crypto.createDecipheriv('aes-256-cbc', encKey, "a2xhcgAAAAAAAAAA");
    var Fcontent = cipherObject.update(data, vaultEngine.outputEncoding, vaultEngine.inputEncoding);
    Fcontent += cipherObject.final(vaultEngine.inputEncoding);
    //console.log("Decryption data is:"+Fcontent);
    return Fcontent;
}

特别是这个错误:

TypeError: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decr
ypt

1 个答案:

答案 0 :(得分:1)

第一个

我担心您的IV会直接硬编码到您的方法中,这表明您对每次加密都使用相同的IV,这是糟糕的坏事。 IV应该是加密随机的(不可预测的),并且对于每个加密都是不同的。您可以将其与加密文本一起存储,然后将其拉回以用于解密,但您不应使用相同的IV。如果您犯了这种程度的错误,则表明您需要对如何正确使用加密进行更多研究,以便它实际上保护您想要保护的数据。 Start here

现在尝试直接解决你的问题:


According to the docs看起来你已经改变了input encodingoutput encoding个变量,它应该是:

var Fcontent = cipherObject.update(data, vaultEngine.inputEncoding, vaultEngine.outputEncoding);
Fcontent += cipherObject.final(vaultEngine.outputEncoding);

...如果这不起作用,我建议进行以下更改:

  1. 使用write()上的流处理end()cipherObject方法,而不是遗留的update()final()方法。由于更新使用节点流(see here),crypto模块被认为是“不稳定”,遗留方法可能会保留,但如果引入了更改,它们将成为斩波块中的第一个
  2. 在发送数据进行解密之前,先从数据中创建一个缓冲区。这将确保您正确创建缓冲区,并最大限度地减少解密阶段所需的工作:

  3. var dataBuffer = new Buffer(data, vaultEngine.inputEncoding);
    cipherObject.write(dataBuffer);
    cipherObject.end();
    return cipherObject.read().toString(vaultEngine.outputEncoding);