• 自然溢出哈希 hack 方法


    今天不知道在什么地方看到这个东西,感觉挺有意思的,故作文以记之(

    (base) 为偶数时,随便造一个长度 (>64) 的字符串,只要它们后 (64) 位相同那么俩字符串的哈希值就相同,直接就卡掉了。

    (base) 为奇数时,对于一个只有 ( ext{a})( ext{b}) 组成的字符串 (s),我们定义 (ar{s}) 为将 (s) 中所有 ( ext{a}) 变为 ( ext{b})( ext{b}) 变为 ( ext{a}) 的结果,然后我们构造 (s_1=" ext{a}",s_i=s_{i-1}+overline{s_{i-1}}),再定义 ( ext{hash}(s)) 为字符串 (s) 的哈希值。那么显然有 ( ext{hash}(s_i)= ext{hash}(s_{i-1}) imes base^{2^{i-2}}+ ext{hash}(overline{s_{i-1}}), ext{hash}(overline{s_i})= ext{hash}(overline{s_{i-1}}) imes base^{2^{i-2}}+ ext{hash}(s_{i-1})),二者相减发现刚好可以表示为 ( ext{hash}(s_i)- ext{hash}(overline{s_i})) 的形式。于是我们记一个 (f_i= ext{hash}(s_i)- ext{hash}(overline{s_i})),那么 (f_i=f_{i-1} imes(base^{2^{i-2}}-1)),而 (base^{2^{x}}-1=(base^{2^{x-1}}+1)(base^{2^{x-2}}+1)cdots(base+1)(base-1)),由 (2 mid base) 知这 (x) 个括号里的东西全是偶数,故 (2^{x+1}mid base^{2^x}-1),于是 (2^{i(i-1)/2}mid f_i),故对于 (ige 12)( ext{hash}(s_i)= ext{hash}(overline{s_i})),构造一个长度 (4096) 的字符串即可叉掉。

    这个故事告诉我们,以后千万不要写自然溢出哈希了

  • 相关阅读:
    Thinkcmf:页面常用函数
    thinkcmf开发--关于控制器
    thinkcmf 常用操作
    Thinkcmf 二次开发
    Sublime Text 3 快捷键精华版
    php动态更改post_max_size, upload_max_filesize等值
    Jquery使用小技巧
    jQuery常用方法和函数
    三层架构
    JDBC
  • 原文地址:https://www.cnblogs.com/ET2006/p/hash-ull-hack.html
Copyright © 2020-2023  润新知