Node.js和加密库

时间:2010-12-21 07:38:43

标签: node.js encryption aes node-crypto

我遇到了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)时,它为null。出于某种原因,如果我将测试设置为“123 | 123123”,它可以工作。那么为什么“123 | 123123”工作但“123 | 123123123123123”没有?

3 个答案:

答案 0 :(得分:28)

你需要存储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中的dec

答案 1 :(得分:8)

RandomEtc是正确的,但万一有人在使用'base64'作为编码时遇到绊倒:不要。坚持'hex'。至少从0.4.2开始,当使用'base64'时,存在可能导致数据损坏的错误。请参阅:https://github.com/joyent/node/issues/738/

答案 2 :(得分:1)

请注意,+=运算符不适用于node.js的更高版本。请按照Node.js Crypto class returning different results with updated version中提供的建议操作并使用Buffer.concat()