首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Hash拓展长度攻击原理剖析

前言

哈希长度扩展攻击(hash lengthextensionattacks)是指针对某些允许包含额外信息的加密散列函数的攻击手段。次攻击适用于MD5和SHA-1等基于Merkle–Damgård构造的算法。

MD5扩展攻击介绍

我们需要了解以下几点md5加密过程:

MD5加密过程中512比特(64字节)为一组,属于分组加密,而且在运算的过程中,将512比特分为32bit*16块,分块运算

关键利用的是MD5的填充,对加密的字符串进行填充(比特第一位为1其余比特为0),使之(二进制)补到448模512同余,即长度为512的倍数减64,最后的64位在补充为原来字符串的长度,这样刚好补满512位的倍数,如果当前明文正好是512bit倍数则再加上一个512bit的一组。

MD5不管怎么加密,每一块加密得到的密文作为下一次加密的初始向量。

举一个例子讲一下如何填充:比如字符串“Acker” 十六进制0x41636b6572这里与448模512不同余,需补位满足二进制长度位512的倍数,补位后的数据如下:

此处补充:以十六进制表示一共是128个字符,十六进制每个字符能够转换成4位二进制,128*4=512这就是一组,正好是512bit。

上图中的8是因为补位时二进制第一位要补1,那么1000转换成16进制就是8.后面都补上0.

填充数据最后8字节长度,Acker长度为5*8=40bit,又因为0×28=40所以16进制显示为28.

为什么数据会在左端:MD5中储存的都是小端方式,比如0×12345678,那么md5存储顺序就是0×78563412

MD5拓展攻击演示

下图为加密流程图,可以更直观看清楚整个流程。

选一个字符串例如“Acker”MD5(“Acker”)= dee2fb2df156f4040f893d8a10ac1034

现在我们不需要知道字符串是什么。只需要知道其长度,并将字符串填充完,新加一个字符串如:addition,之前得到的“Acker”MD5值作为最后一块加密的初始向量,最后得到的结果和MD5(“Acker+addition”)是一样的。

实例

这种攻击方式最实际场景中并不多见,我曾在ctf题中见过一次。这种攻击方法还是要会滴,万一打ctf比赛时候出现了呢……

以实验吧上一道题为例,下面为源码:

题目中可以得到:

$secret的长度15

md5($secret.”adminadmin”)的值为571580b26c65f306376d4f64e53cb5c7

使用hashpump,方法如下图:

第一行是一个新签名作为getmein参数提交

第二行作为password提交即可。

附:hashpump

HashPump是一个借助于OpenSSL实现了针对多种散列函数的攻击的工具,支持针对MD5、CRC32、SHA1、SHA256和SHA512等长度扩展攻击。而MD2、SHA224和SHA384算法不受此攻击的影响,因其部分避免了对状态变量的输出,并不输出全部的状态变量。

安装

使用方法

搜遍百度,无奈没有什么具体讲解方法只好hashpump -h得到帮助,凑合看一下吧。简单总结一下就是知道前面字符总长度,知道下一组追加数据,程序就会自动算出前一组的填充数据。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180312B0YF2700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券