1

我创建了一个允许使用RTCPeerConnection和传输文件的页面datachannels

我需要以某种方式确保接收和传输的文件完全相同,特别是没有一个包丢失,也没有中间的坏人发送邪恶的包。

我将文件分割成块,一块一块地发送这些块,没有任何标识。当另一端出现新的 webrtc 消息时,我将其数据推送到缓冲区而无需任何检查。当传输的大小等于接收的大小时,我组装文件。

这个 while 过程如下所示:

发件人

function sliceFile(offset)
    var reader = new window.FileReader();
    reader.onload = (function () {
        return function (e) {
            sendChannel.send(e.target.result);
            if (self.file.size > offset + e.target.result.byteLength) {
                window.setTimeout(self.sliceFile, 0, offset + CHUNK_SIZE);
            }
        };
    })(self.file);
}

接收者

var receiveBuffer = [];
var receivedSize = 0;
onwebrtcmessage = function(event) {
    receiveBuffer.push(event.data);
    receivedSize += event.data.byteLength;
    if (receivedSize == expectedSize) {
        assembleFile(receiveBuffer);
    }
}

我的问题是: 验证收到的文件是否正确的最佳方法是什么?

我试图在发送者和接收者上计算文件的 md5 校验和。由于FileApi不会产生任何我已知的计算校验和的函数,并且 javascript 的实现会md5杀死超过 15MB 文件的选项卡。这使我无法检查大文件的校验和。

4

0 回答 0