MD5算法全解析( 四 )


1.百度网盘的秒传
看到这估计有人会有些疑问 , 什么是秒传功能?不急 , 待我慢慢道来!
基本概念
假设现在有人分享了一个软件安全书籍的百度云链接给我们 , 然后我们接下来的操作就是 , 打开这个链接 , 接着我们将其保存到我们自己的网盘上 , 然后你会发现不管这个资源有多大 , 都能在几秒内保存到我们的网盘上 , 而这就是所谓的秒传(个人理解有错误请指出)
【MD5算法全解析】原理
秒传看上去很神奇 , 其实原理就是MD5的一致性验证 。当我们成功上传资源到自己网盘时 , 服务器会计算这个完整文件的MD5值 , 然后保存在服务器上 , 当下一次要上传文件时 , 网盘首先会检测服务器是否有相同MD5值的文件 , 如果有的话 , 就直接从服务器复制到网盘上 , 这样就省去了上传的时间
过程
让我们重新解释下上面提到的例子:当分享人在分享软件安全书籍的资源时 , 一定是通过自己的百度网盘上来进行分享 , 这就证明该资源已经保存在服务器中 , 接下来我们打开了这个链接 , 然后点击保存时 , 网盘就检测到这个资源的MD5值已经存在在服务器中 , 所以不需要占用网络带宽 , 直接复制这个资源到我们的网盘上 , 从而实现了秒传 。总体过程下图:

MD5算法全解析

文章插图
 
2.应用程序更新
也许你又纳闷了 , 应用程序更新为什么需要用到MD5?这是为了友好的用户体验以及安全性考虑 , MD5一致性验证可以防止下载的更新APK被恶意篡改或者防止下载的APK不完整造成不良的用户体验 。MD5在应用程序更新中的主要作用就是:
  1. 检验APK文件签名是否一致 , 防止下载被拦截和篡改
  2. 检验下载文件的完整性
五、安全性
上面讲了这么多 , 你会发现从MD5加密本身来讲这个过程是不可逆的 , 但并不意味着MD5算法不可破解 , 破解对于MD5一致性认证没多大影响 , 但是对于MD5的密码认证来说是致命的 。
1. 撞库破解
如果让我们猜密码 , 肯定会猜“123456”,生日 , 手机号等 , 而撞库的原理也就是这么简单 。首先建立一个大型的数据库 , 然后把最常见的 , 有可能出现的密码 , 通过MD5加密成密文 , 并且以这些MD5值为主键加索引 , 将常见的密码为单列存入数据库中 , 并通过不断的积累 , 形成一个巨大的密码MD5数据库 , 这样当你截取到网络上密码的MD5值时 , 通过查询这个巨大的数据库来直接匹配MD5值 , 这就是所谓的撞库 。这么一看撞库有点类似穷举法 , 所以撞库破解的概率是很低的 , 但也不是说不可能破解 。通过下面两个网站就很容易获得原文:
  • www.cmd5.com/
  • pmd5.com/}
2. MD5加盐
2.1 原理
MD5加密可以通过撞库来破解 , 因此为了防止内部人员和外部入侵者通过密码的MD5来反查密码明文 , 需要对密码掺入其它信息 , 然后算出加工后的密码的MD5值称之为MD5加盐 。
2.2 加盐算法
1.账号+密码
这个加盐算法很简单 , 就是将当注册时将用户名和密码组合起来 , 然后计算其组合的MD5值作为密码发送到服务器上 , 这样就能增加反查的难度 。但是这个加盐算法也存在问题 , 当应用程序提供修改用户名这一功能时 , 当用户名发生变化时 , 密码就不可用了(如果要用 , 就必须重新计算新的用户名和密码的MD5值然后发送给服务器 , 这样修改用户名 , 等于修改密码的功能)
2.随机数
原理
我们知道MD5加密有个特性 , 一个数据的MD5值永远都是一样的 , 也正是因为这个特性才有了MD5一致性的验证 , 但是也是撞库破解的一个入口 。正是因为密码的MD5值永远都是一样的 , 所以可以根据MD5值直接从数据库中查询出密码 。因此随机数算法就是给密码加入随机数然后生成新的MD5值 , 这样破坏这个特性 , 让密码的MD5值每次都是不一样的 。


推荐阅读