【问题标题】:Decode a Websocket mask解码 Websocket 掩码
【发布时间】:2019-03-09 00:06:14
【问题描述】:

我正在尝试编写一个函数来解码通过 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,因此无需担心处理额外的字节)

【问题讨论】:

    标签: javascript node.js websocket


    【解决方案1】:

    通过修改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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-20
      • 1970-01-01
      • 2012-12-19
      • 2012-02-29
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 2018-05-24
      • 1970-01-01
      相关资源
      最近更新 更多