Расшифровать маску Websocket - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь написать функцию для декодирования маскированного буфера, отправленного на сервер узла через соединение WebSocket.Используя комбинацию RFC6455 и несколько старых ответов SO, я до сих пор справился с этим:

function decodeMessage(buffer) {

    const opCode = buffer.readUInt8(0) & 0xF;

    if(opCode === 0x1) {
        const data_length = buffer.readUInt8(1) & 0x7F;
        let decoded = Buffer.alloc(data_length);

        const mask_key = buffer.readUInt32BE(2);

        for (let i = 0; i < data_length; i++) {
            decoded[i] = buffer.readUInt8(i) ^ mask_key[i % 4];
        }

        buffer.copy(decoded, 0, 2);

        return decoded.toString('utf8');

    } else {
        return null;
    }
}

С этим кодом есть две проблемы:

  • Он не разоблачает сообщение правильно и просто выводит искаженный Unicode

  • Каждый раз выводит другое декодированное сообщение, даже если ввод постоянный

(длина полезной нагрузки никогда не будет больше 126, поэтому не нужно беспокоиться об обработке дополнительных байтов)

1 Ответ

0 голосов
/ 08 марта 2019

Изменяя функцию из этого поста , я смог заставить это работать:

function decodeMessage(buffer) {

    if((buffer.readUInt8(0) & 0xF) === 0x1) {
        const length = (buffer.readUInt8(1) & 0x7F)+4;

        let currentOffset = 2;
        const mask_key = buffer.readUInt32BE(2);

        const data = Buffer.alloc(length);

        for (let i = 0, j = 0; i < length; ++i, j = i % 4) {
            const shift = j === 3 ? 0 : (3 - j) << 3;

            const mask = (shift === 0 ? mask_key : (mask_key >>> shift)) & 0xFF;
            const source = buffer.readUInt8(currentOffset++);
            data.writeUInt8(mask ^ source, i);
        }

        return data.toString('utf8');

    } else {
        return null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...