MD5
参考 https://zhuanlan.zhihu.com/p/131283811
md5 是一种被广泛使用的密码散列函数,可以产生一个 128 位的(16 进制)散列值,2004 年,我国中科院院士王小云证实 md5 算法无法防止碰撞,因此,不适用于安全性认证。
MD5 碰撞
参考 http://t.csdn.cn/jh9ny
常见的碰撞法:暴力碰撞(穷举法、字典法)
- 穷举法
穷举法就是不停地尝试各种字符的排列组合,看哪一个组合的 MD5 码能对上。缺点是太耗费时间。举个例子,假设我们要破解一个 6 位大小写字母和数字混合的密码,那么一共有 (26 + 26 + 10) ^ 6 种组合。这个数的大小超过 500 亿。 - 字典法
字典法就是把计算结果以映射表的形式存放起来,一个原文对应着一个 MD5 值。将已知的 MD5 码查表,就可直接反查出原文。字典法体现了算法设计的 “以空间换时间” 的思想。缺点是比较耗费空间,而且实际上还是要穷举一遍所有的输入,只不过把穷举的结果存了起来。
MD5 碰撞 & php 弱类型比较
参考 https://qing3feng.github.io/2022/08/23/MD5 碰撞 /
php 弱类型比较
弱类型比较 (), 只判断内容是否相等,如果是字符串类型,则转换成数值型后进行判断
强类型比较 (=), 判断内容的基础上,还会判断类型是否相同
- string&&int
- string&&string
在 PHP 中”0e” 判断为科学计数法,0e123 就是 0 的 10123 次方
1 | "0e123456"=="0e345" //True |
MD5 碰撞 & php 弱比较
- md5(b) & $a != $b
加密前不同,加密后相同,== 若比较,可以利用 0e 开头的形式
常用的 MD5 加密后以 0E 开头的有
1 | QNKCDZO |
- a)
加密前和加密后弱比较相同,前后都得是 0e 开头的形式
1 | 0e215962017 0e291242476940776845150308577824 |
MD5 碰撞 & php 强比较
- md5(b) & $a != $b
- 数组绕过
md5 不能加密数组,传入数组会报错,但会继续执行并且返回结果为 null
md5(a[]=1) === md5(b[]=1)
null === null
MD5-SQL 注入
ffifdyop 的 MD5 加密结果是 276f722736c95d99e921722cf9ed621c
经过 MySQL 编码 (url) 后会变成’or’6xxx, 使 SQL 恒成立,相当于万能密码,可以绕过 md5 () 函数的加密