溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何實(shí)現(xiàn)Baidu network disk秒傳

發(fā)布時(shí)間:2021-09-17 14:03:09 來源:億速云 閱讀:150 作者:柒染 欄目:web開發(fā)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)如何實(shí)現(xiàn)Baidu network disk秒傳,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

如何實(shí)現(xiàn)Baidu network disk秒傳

有個(gè)讀者在微信上問我:百度網(wǎng)盤的秒傳功能是如何實(shí)現(xiàn)的?

如何實(shí)現(xiàn)Baidu network disk秒傳

這個(gè)問題我其實(shí)有想過,我猜測大概是前端計(jì)算一個(gè)文件的哈希值(比如MD5)發(fā)送給后端,網(wǎng)盤服務(wù)器判斷是否存在這個(gè)文件,如果存在就直接在后端完成文件的“轉(zhuǎn)存”,直接告訴前端:上傳成功。

不過這是我自己猜測的,到底對(duì)不對(duì),一直也沒有去驗(yàn)證過。

我把我的猜測告訴了他,結(jié)果他問了一句:如果發(fā)生哈希沖突了怎么辦呢?。

我想了一下又說:那就多加幾個(gè)哈希!

不過百度網(wǎng)盤到底是怎么做的呢?這位讀者既然問到了,我就趁機(jī)花了幾分鐘研究了一下,算是解答了這個(gè)疑惑,增加了知識(shí)。

MD5 沖突

首先,只用一個(gè)哈希值,已經(jīng)有事實(shí)證明是會(huì)發(fā)生沖突的,而不只是理論上。

比如我在知乎上找到了一個(gè)例子,下面兩段不同的數(shù)據(jù),只相差兩個(gè)字節(jié):

如何實(shí)現(xiàn)Baidu network disk秒傳

分別計(jì)算md5,結(jié)果是一樣的:

如何實(shí)現(xiàn)Baidu network disk秒傳

所以,如果只用一個(gè)哈希值就判定是同一個(gè)文件,那就比較容易會(huì)出現(xiàn)張冠李戴的情況。

甚至,有人還基于此提出一種哈希碰撞攻擊:如果我知道一個(gè)文件的md5值,但拿不到這個(gè)文件,我通過數(shù)學(xué)計(jì)算,構(gòu)造一個(gè)相同md5的文件,那豈不是就把那個(gè)文件直接給我轉(zhuǎn)存過來了?如果是一個(gè)私密的文件呢?那不出事了!

百度網(wǎng)盤的做法

那百度網(wǎng)盤是咋做的呢?

首先上傳一個(gè)稍微大一點(diǎn)的文件(小文件有計(jì)算哈希的功夫早就傳完了),使用瀏覽器F12大法,看一下它的網(wǎng)絡(luò)請(qǐng)求:

如何實(shí)現(xiàn)Baidu network disk秒傳

可以看到,百度網(wǎng)盤對(duì)文件進(jìn)行了分塊傳輸,這也是目前業(yè)界比較流行的做法,對(duì)大文件進(jìn)行分塊,如果網(wǎng)絡(luò)不好斷開了,下次只需要傳輸剩下的分塊就行了,做到了斷點(diǎn)續(xù)傳。

不過注意看,在上面分塊的中間,插入了一個(gè)叫rapidupload接口的請(qǐng)求,從名字你也可以猜出來了,這個(gè)接口肯定跟它的“秒傳”功能有關(guān)系

來看一下請(qǐng)求的參數(shù),是一個(gè)Form表單,有這么幾個(gè)字段:

如何實(shí)現(xiàn)Baidu network disk秒傳

content-length: 文件長度

content-md5: 文件的MD5

slice-md5: 文件切片的MD5

看到這里你估計(jì)猜到了,肯定是這三個(gè)參數(shù)聯(lián)合判斷,同時(shí)滿足條件才算是同一個(gè)文件!

來看下服務(wù)器響應(yīng)了什么:

如何實(shí)現(xiàn)Baidu network disk秒傳

秒傳成功了!

那如果上傳一個(gè)后端肯定不存在的文件會(huì)是返回什么呢?我構(gòu)造了一個(gè)做測試:

如何實(shí)現(xiàn)Baidu network disk秒傳

看到了吧,404!說明后端沒這個(gè)文件,那就老老實(shí)實(shí)傳吧!

接著,我想看一下這個(gè)切片md5,百度網(wǎng)盤是怎么在切的。

通過網(wǎng)絡(luò)通信中的Initiator功能,可以定位到是哪里的JS代碼在發(fā)生請(qǐng)求:

如何實(shí)現(xiàn)Baidu network disk秒傳

通過調(diào)用堆棧,看到了叫rapidUpload這個(gè)函數(shù),再上下一跟進(jìn),找到了這個(gè)切片MD5計(jì)算的地方:

如何實(shí)現(xiàn)Baidu network disk秒傳

其實(shí)就是對(duì)文件的前262144個(gè)字節(jié),也就是256KB進(jìn)行計(jì)算。如果文件比這還小,那就用不著秒傳了。

但奇怪的是,我扣取了文件的前256個(gè)字節(jié),計(jì)算出來的md5,和它接口中上傳的參數(shù)并不一致!

這讓我疑惑了好幾分鐘,難道事情沒這么簡單?

我又打了斷點(diǎn)在計(jì)算的位置,發(fā)現(xiàn)它計(jì)算的跟我計(jì)算的又是一樣的,但通過網(wǎng)絡(luò)發(fā)出去以后就變了,真是薛定諤的MD5,奇怪了!

不過,程序不是量子力學(xué),它不會(huì)騙人,很快我就找到了問題所在:百度網(wǎng)盤可能擔(dān)心自己的路數(shù)被發(fā)現(xiàn),對(duì)文件的MD5和切片MD5都進(jìn)行了加密!

這就是加密函數(shù):

如何實(shí)現(xiàn)Baidu network disk秒傳

一些簡單的字符串處理而已。

好了,現(xiàn)在可以回答前面讀者的問題了:

百度網(wǎng)盤上傳時(shí),如果是超過256KB的文件,將計(jì)算整個(gè)文件的MD5和文件前256KB內(nèi)容的MD5,并對(duì)兩個(gè)MD5值加密后請(qǐng)求后端執(zhí)行秒傳。后端通過兩個(gè)MD5和長度信息判斷是否存在該文件,如果存在則完成秒傳。

這樣做,雖然理論上也不能保證不會(huì)發(fā)生哈希碰撞,但通過這種方式,至少將概率降低了許多。

上述就是小編為大家分享的如何實(shí)現(xiàn)Baidu network disk秒傳了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI