前言
最近刷jarvis oj时遇到了哈希长度扩展攻击,本文打算对哈希长度扩展攻击做一个记录
原理
这是MD5的实现流程图,其大致流程如下
MD5中是小端存储,所以计算时需要高低位互换
待加密的字符串被切割成n个长度为512位的消息块,最后一块若不足448位,用1+多个0进行补位,最后64位填充字符串长度
每个消息块会根据上一组产生的registers(链变量)的值进行
复杂的数学变化
生成新的registers值.所以在算法可行的情况下,保证初始链变量唯一,即能保证所有的链变量都唯一.图二的register值0
就是MD5加密算法的初始链变量.而链变量经过高低位互换后就是我们计算出来的md5值
攻击原理
往往加密时,会采取如此的方式进行md5($secret+$message)
而只要我们掌握$secret的长度
和md5($secret+某一字符串)的值
和某一字符串的内容
我们就能推出md5($secret+另一字符串)的值
,此字符串和已知的字符串相关
举例
现已知md5($secret+'admin')
值和$secret的长度为15个字符
根据上文提到的原理我们可以大致得到$secret+'admin'
生成的消息块如下
由MD5加密原理可知链变量就是hash值的高低位转化,也就是我们得到了上图消息块所生成的链变量
我们在上面的消息块后再添加些字符串
即AAAAAAAAAAAAAAA\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0a\00\00\00\00\00\00\00test
的hash值我们也就能计算到了
计算方法就是用上文得到的链变量代替初始链变量,根据md5算法计算test的值,得到的就是我们构造的字符串的hash值
脚本
我们只需要找到一个实现MD5的py脚本,将其初始链变量改为我们的想要的值就行了
但每次这样操作未免有些麻烦,我们可以使用HashPump来直接生成我们想要的东西
具体操作参见哈希长度扩展攻击的简介以及HashPump安装使用方法
参考博客
哈希长度拓展攻击(Hash Length Extension Attacks)
哈希长度扩展攻击的简介以及HashPump安装使用方法
hash长度扩展攻击
Hash长度扩展攻击