关于PHP数组的hash冲突的一点疑问

脱库门着实让2011年的年末过得好不热闹,以至于很少有人把剩余的目光和精力投向除密码外的安全方面,就如28号国外爆出的多语言的哈希表碰撞攻击漏洞

关于该漏洞,网上那段PHP的测试代码已经轻松证明了它的存在,惠新宸的博客里也简单说明了它的原理以及相关补丁

通过自己对测试代码进行了一些修改和运行后,可能由于对原理还不是十分了解,对于测试结果有点疑问还没有弄明白。。。

我的代码如下:

/** 可配置参数 */
define('TOTAL', 20 * 1000); //int,元素个数
define('BUCKET', 0); //int,只决定hash后的具体bucket位置,不影响测试结果
$n = empty($argv[1]) ? 15 : $argv[1]; //从命令行接收n值
$size = pow(2, $n); //2的n次方

$startTime = microtime(true);
$array = array();
for ($i = 0; $i <= TOTAL; ++$i) //循环条件完全相同
{
    $key = $size * $i + BUCKET;
    $array[$key] = 0;
}
$endTime = microtime(true);
echo '插入 ', TOTAL, ' 个恶意元素需要 ', $endTime - $startTime, ' 秒', "\n";

$startTime = microtime(true);
$array = array();
for ($i = 0; $i <= TOTAL; ++$i) //循环条件完全相同
{
    $key = $i;
    $array[$key] = 0;
}
$endTime = microtime(true);
echo '插入 ', TOTAL, ' 个普通元素需要 ', $endTime - $startTime, ' 秒', "\n";

通过了解原理可以知道,虽然碰撞漏洞和元素的插入数量有关(当然需要一定量的元素),但更关键的在于这些元素的特殊键值的选取。

在固定插入元素数量的情况下,pow(2, n)中n的值会对测试结果有很大影响:

n值在15左右的情况下,碰撞漏洞效果最为明显,设置过小或过大则均会逐渐趋于正常。最终结果类似正态分布(如下图)。


说明:该图为两万个元素的情况下。根据元素个数不同,曲线具体坡度也会有变化,但仍属于正态分布。

Why?


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值