1.引子

哈希表的原理是用数组来保存键值对,键值对存放的位置(下标)由键的哈希值决定,键的哈希值可以在参数时间内计算出来,这样哈希表插入、查找和删除的时间复杂度为O(1),但是这是理想的情况下,真实的情况是,键的哈希值存在冲突碰撞,也就是不同的键的哈希值可能相等,一个好的哈希函数应该是尽可能的减少碰撞。解决冲突碰撞的方法有分为两种:开放地址法和 链接法,这里不具体展开。哈希表一般都采用链接法来解决冲突碰撞,也就是用一个链表来将分配到同一个桶(键的哈希值一样)的键值对保存起来。

所谓的哈希碰撞攻击就是,针对哈希函数的特性,精心构造数据,使所有数据的哈希值相同,当这些数据保存到哈希表中,哈希表就会退化为单链表,哈希表的各种操作的时间复杂度提升一个数量级,因此会消耗大量CPU资源,导致系统无法快速响应请求,从而达到拒绝服务攻击(Dos)的目的。

绝大多数语言中map的默认实现都是HashMap,比如Golang、Python,Java有2种HashMap和TreeMap

2.攻击方法与防范机制

通过构造哈希值完全相同的字符串
比如 hash(str1) == hash(str2)
找到大量的哈希值相同的str1、str2、str3 …

这种攻击方法依赖的前提是hash函数本身是不变的。
那么如果hash函数是变化的,那么就会大大增加构造哈希值完全相同的字符串的难度。 由此衍生出方案1。

2.1 方案1 加salt

哈希值的计算变为 hash(salt + str)
salt为特殊的字符串,一般都是固定值
由于salt是不对外暴露的,所以黑客构造哈希值完全相同的字符串的难度就增大了

2.2 方案2 可变的hash函数

如果hash函数本身就是可变的,那么黑客几乎无法构造哈希值完全相同的字符串。
我们来看Golang是怎么做的

type _type struct {...kind       uint8alg        *typeAlg...
}

每个类型都有其对应的typeAlg

// typeAlg is also copied/used in reflect/type.go.
// keep them in sync.
type typeAlg struct {// function for hashing objects of this type// (ptr to object, seed) -> hashhash func(unsafe.Pointer, uintptr) uintptr// function for comparing objects of this type// (ptr to object A, ptr to object B) -> ==?equal func(unsafe.Pointer, unsafe.Pointer) bool
}
var algarray = [alg_max]typeAlg{...alg_STRING:   {strhash, strequal},alg_INTER:    {interhash, interequal},alg_FLOAT32:  {f32hash, f32equal},alg_FLOAT64:  {f64hash, f64equal},alg_CPLX64:   {c64hash, c64equal},...
}
func strhash(a unsafe.Pointer, h uintptr) uintptr {x := (*stringStruct)(a)return memhash(x.str, h, uintptr(x.len))
}

最终我们可以看到

func memhash(p unsafe.Pointer, seed, s uintptr) uintptr {...
}

这里的种子是个每次程序启动都会变化的随机数。 也就是说每次程序启动,同一个字符串的hash值是不同的。下面我们来验证一下。

3. 实验

test_hash.go

package mainfunc main() {var a = make(map[string]int, 5)a["helloworld"] = 1println(a["helloworld"])
}

直接在goland中打断点

第1次程序启动

第2次程序启动

结论

第1次hash值和第2次hash显然不同,由于seed的存在,对于每次程序的启动,可以理解为hash函数都是不同的。

后记

由于笔者不是安全领域的专家,本文必定有所疏漏,欢迎批评指出

参考资料

哈希碰撞攻击与防范机制相关推荐

  1. K:hash(哈希)碰撞攻击

    相关介绍:  哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表.理想情况下哈希表插入和查找操作的时间复杂度均为O(1),任何一个数据项可以在一个与哈希表长度无关的时间内计算出一个哈希值 ...

  2. 24-哈希碰撞攻击是什么?

    24-哈希碰撞攻击是什么? 最近哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招.本文结合PHP内核源码,聊一聊这种攻击的原理及 ...

  3. java 哈希碰撞攻击_php中的哈希碰撞以及防御

    php中的哈希表 php中的变量是以符号表的方式进行存储的,实际上也是个HashTable,哈希表是通过特定的哈希算法将索引转换成特定的index然后映射到对应的槽中,然后采用拉链法,在一个槽中使用链 ...

  4. php 哈希碰撞攻击,浅谈php的哈希碰撞

    hash table在php中由为重要.存储变量的'符号表',array和object存储的数据结构,执行上下文的变量及函数均使用哈希表结构存储. Hash,简单来讲,是一种将任意长度的输入变换成固定 ...

  5. PHP哈希表碰撞攻击原理

    哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招.本文结合PHP内核源码,聊一聊这种攻击的原理及实现. 哈希表碰撞攻击的基本原理 ...

  6. 哈希表碰撞攻击的基本原理

    原文地址:http://blog.jobbole.com/11516/ 来源:张洋 最近哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言 ...

  7. 如何防止因哈希碰撞引起的DoS攻击

    如何防止因哈希碰撞引起的DoS攻击 理解哈希 什么是哈希 哈希和数组 哈希算法 哈希碰撞 鸽巢原理 为什么不能避免哈希碰撞 哈希算法的特点 如何解决哈希碰撞 开放寻址法 线性探测 线性探测法适用场景 ...

  8. DDOS学习笔记(《破坏之王-DDOS攻击与防范深度剖析》)

           最近花了点时间把<破坏之王-DDOS攻击与防范深度剖析>看了一遍,坦白来说,这本书比较浅显,可以说是入门书,当然对于我这种对DDOS一知半解的人来说,也是一本不错的书,起码我 ...

  9. 消息完整性和哈希函数 哈希碰撞与生日攻击 HMAC (Message Integrity and Hash Function)

    消息完整性和哈希函数 1. Message Integrity - 消息的完整性 1.1 消息安全性和消息完整性的联系 2. Message Authentication Code - 消息认证码 2 ...

最新文章

  1. 第九集(第一部分)思科交换机配置文件及IOS备份还原
  2. 与大疆并称双雄、估值近百亿的极飞科技,现在是一家什么公司?
  3. jquery event 封装的源源分析
  4. php类精确验证身份证号码
  5. mysql实现知识图谱_基于电影知识图谱的智能问答系统学习记录
  6. 【摘抄】其实我是间谍!
  7. IRF配置(LACP MAD检测方式)
  8. SQL Server中关于跟踪(Trace)那点事
  9. 未找到.NET Framework v3.5 Service Pack1.若要以“.NET Framework v3.5 Service Pack1“为目标报错 解决方法
  10. iOS循环引用问题集合、内存泄漏、僵尸对象、代码静态分析
  11. 360全景拼接 opencv_GitHub - hellojiawa/AndroidPanoDemo: 使用Opencv全景照片拼接
  12. Hi3519v101 uart驱动
  13. 解决usr/bin/ld: cannot find -lxxx问题
  14. Mac 从命令行启动模拟器
  15. android自带中文字体,Android中的默认字体系列是什么?
  16. Autodesk Inventor: Accelerating Design Using Standards Autodesk Inventor教程之利用标准加速设计过程 Lynda课程中文字幕
  17. 谷歌、Microsoft、火狐浏览器主页被篡改解决方法
  18. 【科普贴】SD卡接口协议详解
  19. 震区归来话旅游867
  20. HTML5字母为30px用h几,HTML 中 1pt 等于多少 px?

热门文章

  1. 车站计算机连锁cad图,微机联锁系统站场平面图CAD的研究与开发
  2. 控制工程专硕现在属于电子信息类_浙江大学多个学院电子信息专硕合集分析
  3. 2021.11.15表演节目事件
  4. Golang数据库编程(MySQL)
  5. linux 启动服务或停止服务
  6. Linux内核sysrq调试调优
  7. matlab牛顿迭代法 方程的根,牛顿迭代法求方程解 程序如下
  8. 2.2. nmtui
  9. wordpress 点赞 ajax,WordPress不用插件实现文章AJAX点赞、文章点赞排行
  10. 基于深度学习的GAN应用风格迁移