我正在使用node.js 8.15 net模块在两个单独的实例中创建一个套接字,并使用从一个实例到另一个实例的管道将在第一个实例中接收的数据传递给第二个实例。我想对两个实例之间的流量进行加密,但仅在任一实例的管道末端解密。例如,我在端口上侦听第一个实例(例如代理)上设备的数据,然后将其通过管道传输到另一个端口上的第二个实例,并且该实例在原始端口上侦听另一个应用程序以与原始设备进行通信。因此,流量是两种方式。如果我不通过加密或解密功能进行处理,则该代码有效。但是,当我尝试使用加密输入数据时,无法从应用程序中看到该设备。
我认为问题在于,流量是通过一种方式进行加密并在一个方向上进行解密的,但是从应答系统的角度来看,这两种情况的回复都不会得到加密或解密。
我已经签出了几个posts和this,但是它们似乎都处理服务器到客户端和后端,而不是在两端加密/解密数据并将其传递。
这就是我要完成的任务。
+_____________+ +________+ +________+ +________+ +__________+
| | | | | | | | | |
| Application |<==>| Client |<==>| Server |<==>| Agent |<==>| Ethernet |
| Interface | | | | | | | | Device |
| Device | |>Encrypt| |<=Pipe=>| |Decrypt>| | |
| | |<Decrypt| | | |Encrypt<| | |
| | | | | | | | | |
+_____________+ +________+ +________+ +________+ +__________+
这里有我尝试过的代码。
如果我注释掉.pipe(decipher)
和.pipe(cipher)
,则可以看到该设备并与其进行交互,但是它并不安全。
const cipher = crypto.createCipheriv(algorithm, key, iv);
const decipher = crypto.createDecipheriv(algorithm, key, iv);
//Add the auto padding here....IT HAVE TO BE after creating the decipher immeditely
//decipher.setAutoPadding(false);
// called from CLI - node proxy3.js 8300 192.168.0.74:44818
var addrRegex = /^(([a-zA-Z\-\.0-9]+):)?(\d+)$/;
var addr = {
from: addrRegex.exec(process.argv[2]),
to: addrRegex.exec(process.argv[3])
};
console.log('from: ', addr.from)
console.log('to: ', addr.to)
if (!addr.from || !addr.to) {
console.log('Usage: <from> <to>');
return;
}
net.createServer({'allowHalfOpen': true}, function(from) {
var to = net.createConnection({
host: addr.to[2],
port: addr.to[3]
});
from
.pipe(cipher)
.pipe(to);
from
.on('error',
function (e) {
console.log('error', e)
}
);
to
.pipe(decipher)
.pipe(from);
to
.on('error',
function (e) {
console.log('error', e)
}
);
}).listen(addr.from[3], addr.from[2]);
有没有一种方法可以在管道传输后告诉数据流的方向,或者检测数据是否已经针对某个方向进行了加密?或者,如果有人可以将我指向另一个方向,我很乐意听。
任何帮助或见解将不胜感激。