我遇到了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”没有?
答案 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()