Javascript objeto perde suas funções, quando passou por Socket.io

votos
2

Eu estou tentando construir um webchat criptografado com Node.js usando Socket.io e nó-forja (um pacote npm que implementa alguns algoritmos de criptografia).

Meu problema é que sempre que eu enviar a mensagem criptografada (que por algum motivo é um objeto) ele perde todas as suas funções que são necessárias para descriptografar a mensagem do outro lado, o meu código de encriptação / desencriptação é a seguinte:

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();
}

Sempre que eu tento enviar a minha mensagem como tal:

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

e decifrá-lo do outro lado:

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

Estou tendo o erro a seguir:

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)

porque sempre que um objecto é enviado através de perdas que Socket.io suas funções (neste caso, .getBytes ()). Fiquei me perguntando se talvez houvesse uma correção para esse problema ou se a melhor coisa para eu fazer é começar de novo com outras opções.

Im também postar um link para uma essência com o projeto em si (talvez seja mais fácil de entender)

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

Publicado 20/10/2018 em 13:42
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Como @Thomas apontou que é necessário criar um novo ByteStringBuffer com a mensagem recebida. Como tal, sempre que uma nova mensagem é recebida o seguinte código deve ser executado:

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

Isto cria um novo objeto ByteStringBuffer que tem os métodos necessários para a descriptografia.

Respondeu 20/10/2018 em 14:45
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more