通过Socket.io传递时,Javascript对象会丢失其功能

时间:2018-10-20 13:42:32

标签: javascript node.js encryption socket.io

我正在尝试使用Socket.io和node-forge(实现某些加密算法的npm软件包)与Node.js构建加密的网络聊天。

我的问题是,每当我发送加密的消息(由于某种原因而成为对象)时,它都会失去解密另一端消息所需的所有功能,我的加密/解密代码如下:

function encrypt (bytesToEncrypt){
    cipher = forge.cipher.createCipher('AES-CBC', key);
    cipher.start({'iv': iv});
    cipher.update(forge.util.createBuffer(bytesToEncrypt));
    cipher.finish();
    var encrypted = cipher.output;
    console.log(encrypted.toHex());
    return encrypted
}

function decrypt (bytesToDecrypt){
    decipher = forge.cipher.createDecipher('AES-CBC', key);
    decipher.start({'iv': iv});
    decipher.update(bytesToDecrypt);
    var result = decipher.finish(); // check 'result' for true/false
    console.log('decryption result = ' + result);
    // outputs decrypted hex
    console.log(decipher.output.toString());
    return decipher.output.toString();
}

每当我尝试这样发送消息时

socket.emit('chat message', encrypt("Hello world"));

并在另一端将其解密:

    socket.on('chat message', function(msg){
        decrypt(msg)
    });

我收到以下错误:

Uncaught TypeError: e.getBytes is not a function
at n.o.ByteStringBuffer.putBuffer (forge.min.js:1)
at a.cipher.BlockCipher.n.update (forge.min.js:8923)
at decrypt ((index):68)

因为每当通过socket.io发送对象时,它就会失去其功能(在本例中为.getBytes())。 我想知道是否可以解决此问题,或者对我来说最好的办法是从其他选择重新开始。

我还发布了项目本身的要点链接(可能更易于理解)

https://gist.github.com/goncalo-ribeiro/b84fca008b3948cd3061a5c47b1c9b65

1 个答案:

答案 0 :(得分:1)

正如@Thomas指出的,有必要使用收到的消息创建一个新的ByteStringBuffer。这样,每当收到新消息时,都应执行以下代码:

    socket.on('chat message', function(msg){
        var message = new forge.util.ByteStringBuffer(msg.data);
        console.log(message)
        decrypt(message)
    });

这将创建一个新的ByteStringBuffer对象,该对象具有解密所需的方法。