10

我在使用 Node 的加密库时遇到了奇怪的问题。我写了这个简单的 AES 测试脚本:

var cipher = crypto.createCipher('aes-256-cbc','InmbuvP6Z8')
var text = "123|123123123123123";
cipher.update(text,'utf8','hex')
var crypted = cipher.final('hex')
var decipher = crypto.createDecipher('aes-256-cbc','InmbuvP6Z8')
decipher.update(crypted,'hex','utf8')
var dec = decipher.final('utf8')

当我执行 console.log(dec) 时,它为空。出于某种原因,如果我将测试设置为“123|123123”,它就可以工作。那么为什么“123|123123”有效而“123|123123123123123”无效呢?

4

3 回答 3

29

您需要存储 cipher.update 和 cipher.final 的返回值,以确保您拥有一切。

cipher.update “返回加密的内容,并且可以在流式传输时使用新数据多次调用”:

http://nodejs.org/docs/v0.2.5/api.html#cipher-update-247

cipher.final “返回任何剩余的加密内容”。

我认为您只需将结果附加到每个调用中,如下所示:

var crypto = require('crypto');
var cipher = crypto.createCipher('aes-256-cbc','InmbuvP6Z8');
var text = "123|123123123123123";
var crypted = cipher.update(text,'utf8','hex');
crypted += cipher.final('hex');
var decipher = crypto.createDecipher('aes-256-cbc','InmbuvP6Z8');
var dec = decipher.update(crypted,'hex','utf8');
dec += decipher.final('utf8');

我得到 '12443a347e8e5b46caba9f7afc93d71287fbf11169e8556c6bb9c51760d5c585' 用于加密和 '123|123123123123123' 用于上面的节点 v0.2.5

于 2010-12-24T17:22:23.590 回答
8

RandomEtc 是正确的,但以防万一有人在这个问题上绊倒时使用'base64'作为他们的编码:不要。坚持'hex'。至少从 0.4.2 开始,有一个错误会在'base64'使用时导致数据损坏。见:https ://github.com/joyent/node/issues/738/

于 2011-03-09T05:20:08.040 回答
1

请注意,该+=运算符在 node.js 的更高版本中将不起作用。请遵循Node.js Crypto 类中给出的建议,使用更新版本返回不同的结果并使用Buffer.concat()

于 2013-12-12T16:09:38.733 回答