关注

“程序IT圈

”,与百万开发者在一起

有个读者在微信上问我:百度网盘的秒传功能是如何实现的?

这个问题我其实有想过,我猜测大概是前端计算一个文件的哈希值(比如MD5)发送给后端,网盘服务器判断是否存在这个文件,如果存在就直接在后端完成文件的“转存”,直接告诉前端:上传成功。

不过这是我自己猜测的,到底对不对,一直也没有去验证过。

我把我的猜测告诉了他,结果他问了一句:如果发生哈希冲突了怎么办呢?

我想了一下又说:那就多加几个哈希!

不过百度网盘到底是怎么做的呢?这位读者既然问到了,我就趁机花了几分钟研究了一下,算是解答了这个疑惑,增加了知识。

MD5 冲突

首先,只用一个哈希值,已经有事实证明是会发生冲突的,而不只是理论上。

比如我在知乎上找到了一个例子,下面两段不同的数据,只相差两个字节:

分别计算md5,结果是一样的:

所以,如果只用一个哈希值就判定是同一个文件,那就比较容易会出现张冠李戴的情况。

甚至,有人还基于此提出一种哈希碰撞攻击:如果我知道一个文件的md5值,但拿不到这个文件,我通过数学计算,构造一个相同md5的文件,那岂不是就把那个文件直接给我转存过来了?如果是一个私密的文件呢?那不出事了!

百度网盘的做法

那百度网盘是咋做的呢?

首先上传一个稍微大一点的文件(小文件有计算哈希的功夫早就传完了),使用浏览器F12大法,看一下它的网络请求:

可以看到,百度网盘对文件进行了分块传输,这也是目前业界比较流行的做法,对大文件进行分块,如果网络不好断开了,下次只需要传输剩下的分块就行了,做到了断点续传

不过注意看,在上面分块的中间,插入了一个叫rapidupload接口的请求,从名字你也可以猜出来了,这个接口肯定跟它的“秒传”功能有关系

来看一下请求的参数,是一个Form表单,有这么几个字段:

content-length: 文件长度

content-md5: 文件的MD5

slice-md5: 文件切片的MD5

看到这里你估计猜到了,肯定是这三个参数联合判断,同时满足条件才算是同一个文件!

来看下服务器响应了什么:

秒传成功了!

那如果上传一个后端肯定不存在的文件会是返回什么呢?我构造了一个做测试:

看到了吧,404!说明后端没这个文件,那就老老实实传吧!

接着,我想看一下这个切片md5,百度网盘是怎么在切的。

通过网络通信中的Initiator功能,可以定位到是哪里的JS代码在发生请求:

通过调用堆栈,看到了叫rapidUpload这个函数,再上下一跟进,找到了这个切片MD5计算的地方:

其实就是对文件的前262144个字节,也就是256KB进行计算。如果文件比这还小,那就用不着秒传了。

但奇怪的是,我扣取了文件的前256个字节,计算出来的md5,和它接口中上传的参数并不一致!

这让我疑惑了好几分钟,难道事情没这么简单?

我又打了断点在计算的位置,发现它计算的跟我计算的又是一样的,但通过网络发出去以后就变了,真是薛定谔的MD5,奇怪了!

不过,程序不是量子力学,它不会骗人,很快我就找到了问题所在:百度网盘可能担心自己的路数被发现,对文件的MD5和切片MD5都进行了加密!

这就是加密函数:

一些简单的字符串处理而已。

好了,现在可以回答前面读者的问题了:

百度网盘上传时,如果是超过256KB的文件,将计算整个文件的MD5和文件前256KB内容的MD5,并对两个MD5值加密后请求后端执行秒传。后端通过两个MD5和长度信息判断是否存在该文件,如果存在则完成秒传。

这样做,虽然理论上也不能保证不会发生哈希碰撞,但通过这种方式,至少将概率降低了许多。

最后给大家留一个思考题:后端拿到MD5后,怎么判断后端是否有这个MD5呢? 这可是大厂经常爱考的一个面试题哦,来开动脑筋想一下!

爆了一篇100万爆款视频················· END ·················
长按进入小程序,进行打卡签到新一期打卡签到,奖品超多(更多精彩值得期待……)
最近热文:一周内被程序员疯转5.6W次,最终被大厂封杀!字节跳动《算法中文手册》火了,完整版 PDF 开放下载!华为败诉,“鸿蒙”商标申请被驳回 !!!
抖音服务器带宽有多大,为什么能够供那么多人同时刷?
职场人深夜啪啪啪大赏,HR会的也太多了叭!2T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,人工智能,考研,软考,英语,等等。在公众号内回复「资源」,即可免费获取!回复「社群」,可以邀请你加入读者群!
❤️给个「在看」,是对我最大的支持❤️

嘿嘿,我发现了百度网盘秒传的秘密 !!相关推荐

  1. ★简单明确( ̄︶ ̄)↗——百度网盘秒传链接教程(使用火狐浏览器)

    目录 前言 一.下载火狐浏览器 二.安装油猴插件Tampermonkey 三.安装插件秒传提取Greasy Fork 四.复制秒传链接到网页版百度网盘 五.如何生成秒传链接 *六.在 Microsof ...

  2. 百度网盘秒传链接怎么用及实现原理

    为了防止分享链接被恶意举报,一些资源提供者开始使用秒传链接形式进行分享.本文探索了秒传链接提取的原理,并介绍了简单的用法. 如何使用 关于原理的部分请跳到下一节. 安装扩展及脚本(1.2均为必选,非二 ...

  3. 百度网盘秒传链接生成及提取方法

    百度网盘秒传链接生成及提取方法 1.认识秒传链接 首先,我们认识一下秒传链接的格式: 秒传链接是由标准提取码+文件名组成.例如下面的格式: fd00338387f50ee5919eb3df4cfce6 ...

  4. [网盘工具/百度网盘]秒传链接的使用 -2022版油猴网页脚本

    注:此项技术仅针对百度网盘有效 软件要求:Chrome或Firefox等支持tampermonkey.Violentmonkey的浏览器. 1.什么是秒传链接? 度盘秒传链接(标准提取码)由128位( ...

  5. 【iOS】百度网盘秒传链接/标准码的转存

    用快捷指令转存百度网盘梦姬标准码 网上几乎没人弄iOS转存标准码的东西.最近盯上了iOS的快捷指令,里面那个获取URL内容简直万能 上图: 需要抓包软件,但是实在想不出更好的方法了.bdtoken也有 ...

  6. 百度网盘上传慢的解决方法

    百度网盘是现在大部分人都在使用的网盘,可以存储图片.文件.信息等等资源,但是大家不满的主要是说下载速度.上传速度太慢了,有什么办法可以改善吗?下面小编就给大家介绍两个方法. 百度网盘上传速度太慢怎么解 ...

  7. java 百度网盘上传_使用pcs api往免费的百度网盘上传下载文件的方法

    百度个人云盘空间大,完全免费,而且提供了pcs api供调用操作文件,在平时的项目里往里面保存一些文件是很实用的. 环境准备: 开通读写网盘的权限及获取access_token:http://blog ...

  8. 使用百度网盘上传大文件到云服务器

    因为需要把几个7G大小左右的数据上传至服务器,但无奈使用的是共享服务器,上传速度非常慢.管理员建议可以用奶牛快传(目前收费)中转,百度搜了一下,百度网盘有相同作用,正好有会员,就使用了百度网盘来传,速 ...

  9. linux百度网盘上传下载bypy

    linux百度网盘上传下载bypy 安装bypy 链接百度云 上传文件或文件夹 下载文件或文件夹 关闭链接.退出授权 其他操作 安装bypy pip install bypy 链接百度云 bypy i ...

最新文章

  1. 《VMware vCAT权威指南:成功构建云环境的核心技术和方法》一3.6 vCloud计量
  2. python——字符串常用方法
  3. Google Gears 指南
  4. boost::contract模块实现ifdef宏功能测试程序
  5. java mysql 触发器 存储过程_mysql 触发器 存储过程 java调用
  6. 面试题56: 数组中数字出现的次数
  7. 服务器和前台采用JSON通讯
  8. java 多线程同步 通过实现Runnable的示例
  9. jquery节点查询
  10. ubuntu火狐证书问题
  11. 选中连线的话,整个连线会显示在一个框里面
  12. python图灵机器人怎么退出_python调用图灵机器人实现微信自动回复
  13. Weblogic java生成wlfullclient.jar
  14. 最新PHP扩展SG11解密教程分享+视频模式
  15. html嵌入word文档,网页中嵌入word文档和导出数据到word文档
  16. 用MicroPython开发ESP32-文件传输工具-ampy
  17. 如何在线制作gif图片?
  18. 微信小程序引用Vant组件库message: 没有找到可以构建的 NPM 包,请确认需要参与构建的 npm 都在 `miniprogramRoot` 目录内...
  19. GitHub上常用第三方库
  20. 如何获取显示器的EDID信息

热门文章

  1. 输入金额校验(数字非负数保留2位不四舍五入)
  2. C/C++八大排序(c/c++)
  3. [Presto]什么是Presto
  4. 计算机科学的鼻祖,他是现代计算机科学的鼻祖,编程界的上帝
  5. unittest框架-基础知识
  6. VMware Horizon Client安装使用问题
  7. 双重差分模型DID学习笔记
  8. 分布式数字身份DID调研
  9. NQI国家质量基础设施“一站式”公共服务平台开发建设
  10. c51语言的printf,KeilC51中的库函数printf