91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現Baidu network disk秒傳

發布時間:2021-09-17 14:03:09 來源:億速云 閱讀:155 作者:柒染 欄目:web開發

這期內容當中小編將會給大家帶來有關如何實現Baidu network disk秒傳,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

如何實現Baidu network disk秒傳

有個讀者在微信上問我:百度網盤的秒傳功能是如何實現的?

如何實現Baidu network disk秒傳

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

不過這是我自己猜測的,到底對不對,一直也沒有去驗證過。

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

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

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

MD5 沖突

首先,只用一個哈希值,已經有事實證明是會發生沖突的,而不只是理論上。

比如我在知乎上找到了一個例子,下面兩段不同的數據,只相差兩個字節:

如何實現Baidu network disk秒傳

分別計算md5,結果是一樣的:

如何實現Baidu network disk秒傳

所以,如果只用一個哈希值就判定是同一個文件,那就比較容易會出現張冠李戴的情況。

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

百度網盤的做法

那百度網盤是咋做的呢?

首先上傳一個稍微大一點的文件(小文件有計算哈希的功夫早就傳完了),使用瀏覽器F12大法,看一下它的網絡請求:

如何實現Baidu network disk秒傳

可以看到,百度網盤對文件進行了分塊傳輸,這也是目前業界比較流行的做法,對大文件進行分塊,如果網絡不好斷開了,下次只需要傳輸剩下的分塊就行了,做到了斷點續傳。

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

來看一下請求的參數,是一個Form表單,有這么幾個字段:

如何實現Baidu network disk秒傳

content-length: 文件長度

content-md5: 文件的MD5

slice-md5: 文件切片的MD5

看到這里你估計猜到了,肯定是這三個參數聯合判斷,同時滿足條件才算是同一個文件!

來看下服務器響應了什么:

如何實現Baidu network disk秒傳

秒傳成功了!

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

如何實現Baidu network disk秒傳

看到了吧,404!說明后端沒這個文件,那就老老實實傳吧!

接著,我想看一下這個切片md5,百度網盤是怎么在切的。

通過網絡通信中的Initiator功能,可以定位到是哪里的JS代碼在發生請求:

如何實現Baidu network disk秒傳

通過調用堆棧,看到了叫rapidUpload這個函數,再上下一跟進,找到了這個切片MD5計算的地方:

如何實現Baidu network disk秒傳

其實就是對文件的前262144個字節,也就是256KB進行計算。如果文件比這還小,那就用不著秒傳了。

但奇怪的是,我扣取了文件的前256個字節,計算出來的md5,和它接口中上傳的參數并不一致!

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

我又打了斷點在計算的位置,發現它計算的跟我計算的又是一樣的,但通過網絡發出去以后就變了,真是薛定諤的MD5,奇怪了!

不過,程序不是量子力學,它不會騙人,很快我就找到了問題所在:百度網盤可能擔心自己的路數被發現,對文件的MD5和切片MD5都進行了加密!

這就是加密函數:

如何實現Baidu network disk秒傳

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

好了,現在可以回答前面讀者的問題了:

百度網盤上傳時,如果是超過256KB的文件,將計算整個文件的MD5和文件前256KB內容的MD5,并對兩個MD5值加密后請求后端執行秒傳。后端通過兩個MD5和長度信息判斷是否存在該文件,如果存在則完成秒傳。

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁强县| 宁化县| 江安县| 保靖县| 姚安县| 屏东市| 沙田区| 高陵县| 巴中市| 穆棱市| 阿尔山市| 延边| 酒泉市| 丰城市| 朝阳县| 永川市| 嘉荫县| 沁阳市| 吉木乃县| 乐清市| 南充市| 北京市| 华宁县| 高碑店市| 平舆县| 奇台县| 景谷| 股票| 基隆市| 石柱| 子长县| 大荔县| 鄂州市| 肥城市| 七台河市| 常山县| 寻甸| 曲麻莱县| 五家渠市| 宁津县| 兴城市|