Node.js和加密库

Mik*_*ike 10 encryption aes node.js 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')
Run Code Online (Sandbox Code Playgroud)

当我执行console.log(dec)时,它为null.出于某种原因,如果我将测试设置为"123 | 123123",它可以工作.那么为什么"123 | 123123"工作但"123 | 123123123123123"不工作?

Ran*_*Etc 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');
Run Code Online (Sandbox Code Playgroud)

我得到'12443a347e8e5b46caba9f7afc93d71287fbf11169e8556c6bb9c51760d5c585'用于crypted和'123 | 123123123123123'用于dec以上节点v0.2.5

  • RandomEtc是正确的,请记住,在node.js中,所有内容都精简了流,以及流.哈希和密码函数可以用文本多次更新,只是添加文本,但为了得到结果,你必须做一个hash.digest或cipher.final (3认同)

Tre*_*ham 8

RandomEtc是正确的,但万一有人在这个问题上磕磕绊绊地使用'base64'它们作为编码:不要.坚持'hex'.至少从0.4.2开始,有一个错误可能导致'base64'使用时数据损坏.请参阅:https://github.com/joyent/node/issues/738/