解码Websocket掩码

时间:2019-03-07 10:35:15

标签: javascript node.js websocket

我正在尝试编写一个函数来解码通过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 :(得分:0)

通过修改this post中的函数,我可以使它工作:

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