javascript – 如何处理Node.js加密流中的块长度

前端之家收集整理的这篇文章主要介绍了javascript – 如何处理Node.js加密流中的块长度前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想隐藏输入流,并通过TCP将其发送到另一台服务器.到现在为止还挺好.一切顺利,直到连接关闭.在几乎任何情况下,不能满足192位所需的块大小,尽管我打开了自动填充,但是脚本以错误的最终块长度崩溃.

当使用传统接口时,似乎自动填充仅适用.我在这里做错了吗?

var net = require("net"),crypto = require("crypto");

var credentials = { algorithm: "aes192",password: "password" },decipher = crypto.createDecipher(credentials.algorithm,credentials.password),cipher = crypto.createCipher(credentials.algorithm,credentials.password);

decipher.setAutoPadding(true);
cipher.setAutoPadding(true);

net.createServer(function(socket) {
  socket.pipe(socket);
}).listen(2000);

var socket = net.connect(2000);

socket.pipe(decipher).pipe(process.stdout);
process.stdin.pipe(cipher).pipe(socket); 

socket.write("Too short.");
socket.end();

在我理想的Node.js世界中,当源流关闭时,(De-)Cipher Stream将自动填充最后一个块.我认为这是一个设计缺陷.

除了opening an issue,我如何规避这种行为?我必须在Socket和(De-)Cipher Streams之间放置一个字节计数器吗?

解决方法

你已经设置了这样的管道:
stdin | cipher | socket (loopback) | decipher | stdout

但是您可以通过直接写入套接字来绕过加密,使用它们:

socket (loopback) | decipher | stdout

尝试使用此代码

var net = require("net"),credentials.password);

decipher.setAutoPadding(false); //set to false to keep the padding
cipher.setAutoPadding(true);

//Loopback
server = net.createServer(function(socket) {
  socket.pipe(socket);
})

server.listen(2000);

var socket = net.connect(2000);

//cipher to the loopback socket,to decipher and stdout
cipher.pipe(socket).pipe(decipher).pipe(process.stdout);

//write some data 
cipher.write("Too short.");

//Clean exit
cipher.end();
server.unref();

为了演示的目的,我从Decryptor对象中删除自动填充,以便您可以看到剩余的填充.在xxd中管理程序(在命令行,而不是节点)给我这个输出

$nodejs so.js | xxd
0000000: 546f 6f20 7368 6f72 742e 0606 0606 0606  Too short.......

与0x06重复6次.

猜你在找的JavaScript相关文章