密码学系列之:碰撞抵御和碰撞攻击collision attack

简介

hash是密码学和平时的程序中经常会用到的一个功能,如果hash算法设计的不好,会产生hash碰撞,甚至产生碰撞攻击。

今天和大家详细探讨一下碰撞攻击。

什么是碰撞攻击

所谓碰撞攻击指的是对于同一个hash函数来说,两个不同的input通过hash计算得到了同样的hash值。用公式来说就是:

hash(m1) = hash(m2)

这个攻击有什么作用呢?

举个例子,通常我们通过网络下载应用程序或者软件,除了下载链接之外,还会提供一个MD5的校验码。这个校验码就是用来校验下载的软件是不是官方提供的软件。

MD5算法也是一种hash算法,如果恶意用户可以构造一个和原始软件一样MD5的软件的话,就很可能实施碰撞攻击。

还有一种情况用在数字签名中。在数字签名中,因为效率的原因,如果文章特别大的情况下,通常会先取文章的hash值,然后对这个hash进行签名。

所以这里面有两个可以被攻击的地方,一个就是hash碰撞,一个就是签名算法。

举个例子,比如说师妃暄给徐子陵写了一封信A,说是凌晨的时候在竹林有事情相告,但是没有直接交给徐子陵而是给了他的好兄弟寇仲,寇仲考虑到夜晚太危险了,不想让他的好兄弟冒险,于是伪造了这封信A,构造了和原来的信A同样hash值的信B,并附带了师妃暄的签名。

徐子陵收到了信B和签名,经过验证发现确实是师妃暄写的,于是就没有去赴约。

碰撞攻击取决于hash算法的强度,像是MD5和SHA-1这些hash算法已经被证明是不安全的,可以在很快的时间内被攻破。

选择前缀冲突攻击

除了前面传统的碰撞攻击之外,还有一种叫做Chosen-prefix collision attack选择前缀冲突攻击。

攻击者可以选择两个不同的前缀p1和p2,然后附在不同的字符串m1,m2前面,那么有:

 hash(p1 ∥ m1) = hash(p2 ∥ m2)    其中 ∥ 表示连接符

我们看一个在SHA-1中由盖坦.勒伦(Gatan Leurent)和托马.佩林(Thomas Peyrin)发现的一个攻击的例子,这是两个分别带有前缀99040d047fe81780012000和99030d047fe81780011800的例子。

两个消息内容可以从下面下载:

messageA: sha-mbles.github.io/messageA

messageB:sha-mbles.github.io/messageB

我们可以看下消息的截图:

这两个消息经过sha1sum运算,可以得到相同的hash值。

sha1sum messageA : 8ac60ba76f1999a1ab70223f225aefdc78d4ddc0

sha1sum messageB: 8ac60ba76f1999a1ab70223f225aefdc78d4ddc0

java中的hash攻击

java中有一个经常会用到的类叫做hashMap,在JDK7之前,HashMap在存储数据的时候如果遇到了hash冲突,则会将数据以链表的形式插入到这个hash节点的最后。

这样会有什么缺点呢?

那么就是如果有恶意攻击者,一直向hashMap中插入同样hash值的key对象,那么hashMap实际上就会退化成为一个链表。

这样会大大影响hashMap的查询效率。如果数据特别大的话,可能就会导致DDOS攻击。

这个问题的根本原因就是java中hashMap中的hash计算太过简单,很容易就能够找到相同hash值的key。

实际上在2011年tomcat还发布了一个关于这个问题的漏洞解决方案。

虽然这是java的问题,但是最后的锅还是由tomcat来背。tomcat的做法就是限制maxPostSize,从最大的20M改成了10K,这样可以有效的减少请求中的item大小。

当然,在JDK8中,原来的链表结构已经被改成了红黑树结构,相信也是为了避免这种DDOS hash攻击的方案。

原像攻击Preimage attack

和碰撞攻击类似的还有一个攻击叫做原像攻击。

原像攻击的抵御需要满足两个条件,第一个条件是给定一个hash值y,很难找到一个x,使得hash(x)=y。

第二个条件就是给定一个x,很难找到一个y,使得hash(x) = hash(y)。

很明显,碰撞攻击的抵御一定满足第二个条件,但是不一定满足第一个条件。

本文已收录于 http://www.flydean.com/collision-attack/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

密码学系列之:碰撞抵御和碰撞攻击collision attack的更多相关文章

  1. 密码学系列之:Merkle–Damgård结构和长度延展攻击

    密码学系列之:Merkle–Damgård结构和长度延展攻击 简介 Merkle–Damgård结构简称为MD结构,主要用在hash算法中抵御碰撞攻击.这个结构是一些优秀的hash算法,比如MD5,S ...

  2. 密码学系列之:memory-hard函数

    密码学系列之:memory-hard函数 目录 简介 为什么需要MHF Memory hard的评估方法 MHF的种类 MHF的密码学意义 memory-hard在MHF中的应用 简介 Memory ...

  3. 使用DDOS deflate抵御少量DDOS攻击

    DDoS-Deflate是一款非常小巧的防御和减轻DDoS攻击的工具,它可以通过监测netstat来跟踪来创建大量互联网连接的IP地址信息,通过APF或IPTABLES禁止或阻档这些非常IP地址. 工 ...

  4. 初识md5碰撞与crc32碰撞

    现在是晚上23:29.写这篇文章呢,是因为早些时候我胃疼,是因为凉导致的胃疼.凉呢喝了一些热水,喝完热水胃倒是不疼了,但是由于我喝的是茶叶开水,于是就导致失眠了.想来想去这漫漫长夜也没意思,于是就决定 ...

  5. Web安全系列(三):XSS 攻击进阶(挖掘漏洞)

    前言 在前些章节 (web安全系列(一):XSS 攻击基础及原理)以及(Web安全系列(二):XSS 攻击进阶(初探 XSS Payload))中,我详细介绍了 XSS 形成的原理以及 XSS 攻击的 ...

  6. 游戏中的2D OBB碰撞模型的碰撞算法介绍和实践

    前言 上一篇博文说道,射线与场景中模型上的所有三角形求交时,会大幅度影响效率且花费比较多的时间,因此会采取使用包围盒的形式,进行一个加速求交.在此文中介绍OBB碰撞模型的碰撞算法 OBB的碰撞模型 有 ...

  7. 密码学系列之:feistel cipher

    密码学系列之:feistel cipher 简介 feistel cipher也叫做Luby–Rackoff分组密码,是用来构建分组加密算法的对称结构.它是由德籍密码学家Horst Feistel在I ...

  8. 密码学系列之:memory-bound函数

    密码学系列之:memory-bound函数 目录 简介 内存函数 内存受限函数 内存受限函数的使用 简介 memory-bound函数可以称为内存受限函数,它是指完成给定计算问题的时间主要取决于保存工 ...

  9. 密码学系列之:bcrypt加密算法详解

    目录 简介 bcrypt的工作原理 bcrypt算法实现 bcrypt hash的结构 hash的历史 简介 今天要给大家介绍的一种加密算法叫做bcrypt, bcrypt是由Niels Provos ...

随机推荐

  1. JVM调优基础到进阶

    GC和GC Tuning GC的基础知识 1.什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 Java: new ? 自动内存回收,编程上 ...

  2. Kernighan《UNIX 传奇:历史与回忆》杂感

    Brian W. Kernighan 是一个伟大的技术作家,我买了他写的几乎所有书.他近些年的书我买的是 Kindle 电子版,不占地方. 以下是我手上保存的纸版书: Kernighan 的书大多与别 ...

  3. IDA动态调试Android的DEX文件

    Android程序的dex文件的动态调试确实是个大问题,网上也有一些教程但是不是特别的详细,今天用到了IDA动态调试Android的DEX文件,特此记录一下. IDA 6.6新添加了对dex文件的调试 ...

  4. hdu1255 扫描线,矩形重叠面积(两次以上)

    题意:       给你n个矩形,然后问你这n个矩形所组成的画面中被覆盖至少两次的面积有多大. 思路:       和1542差距并不是很大,大体上还是离散化+线段树扫面线,不同的地方就是这个题目要求 ...

  5. POJ2296二分2sat

    题意:       给n个点,每个点必须在一个正方形上,可以在正方向上面边的中点或者是下面边的中点,正方形是和x,y轴平行的,而且所有的点的正方形的边长一样,并且正方形不能相互重叠(边相邻可以),问满 ...

  6. (邹博ML)凸优化

    目录 凸集的基本概念 凸函数的基本概念 凸优化的一般提法 凸集基本概念 思考两个不能式 两个正数的算术平均数大于等于几何平均数 给定可逆对称阵Q,对于任意向量x,y,有: 思考凸集和凸函数 在机器学习 ...

  7. .NET并发编程-TPL Dataflow并行工作流

    本系列学习在.NET中的并发并行编程模式,实战技巧 本小节了解TPL Dataflow并行工作流,在工作中如何利用现成的类库处理数据.旨在通过TDF实现数据流的并行处理. TDF Block 数据流由 ...

  8. Log4j讲解

    讲解 通常,我们写代码的过程中,免不了要输出各种调试信息.在没有使用任何日志工具之前,都会使用 System.out.println 来做到. 这么做直观有效,但是有一系列的缺点:1. 不知道这句话是 ...

  9. 【Azure 环境】在Azure虚拟机(经典) 的资源中,使用SDK导出VM列表的办法

    Azure,  在2008年10月的Microsoft专业开发人员大会(PDC)上宣布,当时使用内部项目代号"Project Red Dog",并于2010年2月正式发布为Wind ...

  10. 【BUAA软工】Beta阶段事后分析

    设想与目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决的问题 总体解决的问题:新手编程者配置编程环境难.本地编写的代码跨设备同步难.本地ide安装使用过程 ...