节点encryption解码stream抛出EVP_DecryptFinal_ex:如果stream将被中断,则错误的最终块长度

我有一个node.js客户端,从另一个主机下载和解密AESencryption文件。

var base64 = require('base64-stream'); var crypto = require('crypto'); var aes = crypto.createDecipher('aes-256-cbc', crypto.createHash('sha256').update(pass).digest('hex')); // file stream var file = fs.createWriteStream(params.target); var base64reader = base64.decode(); response.pipe(base64reader) // decode base64 .pipe(aes) // decrypt .pipe(file); // write in file // on last data chunk received: file load complete aes.on('end', function (chunk) { if (typeof params.success !== 'undefined') params.success(); }); 

如果其他主机在完成请求之前意外closures了他的连接,则上面的代码将引发此错误:

 TypeError: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length at Decipher.Cipher._flush (crypto.js:262:27) at Decipher.eval (_stream_transform.js:130:12) at Decipher.g (events.js:187:16) at Decipher.EventEmitter.emit (events.js:95:17) at prefinish (_stream_writable.js:427:12) at finishMaybe (_stream_writable.js:435:7) at afterWrite (_stream_writable.js:317:3) at onwrite (_stream_writable.js:307:7) at WritableState.onwrite (_stream_writable.js:100:5) at afterTransform (_stream_transform.js:99:5) at TransformState.afterTransform (_stream_transform.js:74:12) at Decipher.Cipher._transform (crypto.js:258:3) at Decipher.Transform._read (_stream_transform.js:179:10) at Decipher.Readable.read (_stream_readable.js:334:10) at flow (_stream_readable.js:743:26) at WriteStream.eval (_stream_readable.js:601:7) 

我尝试添加一个aes.on('错误',函数((){…});处理程序,但它不会被调用。

 response.on('end', function() { aes.emit('close'); }); response.on('close', function() { aes.emit('close'); }); 

但是然后aes.on('end',…); 将不会被调用。 给这个语句添加aes.emit('end')是没有意义的,因为如果错误导致上面的错误,也会调用它。

 response.on('end', function() { aes.emit('end'); aes.emit('close'); }); response.on('close', function() { aes.emit('end'); aes.emit('close'); }); 

有没有人有一个想法,我怎么能赶上这个错误?

非常感谢!!

它是一个在node.js v0.11.9中的bug,在v0.11.13中解决。 然后aes.on('error',…)将被正确调用。