Home >php教程 >php手册 >使用MD5变换算法防穷举(冲撞)破译密码

使用MD5变换算法防穷举(冲撞)破译密码

WBOY
WBOYOriginal
2016-06-21 09:15:411147browse

换算|算法

    MD5是在Web应用程序中最常用的密码加密算法。由于MD5是不可逆的,因而经过MD5计算得到后的密文,不能通过逆向算法得到原文。

  回顾在Web应用程序中使用MD5加密文本密码的初衷,就是为了防止数据库中保存的密码不幸泄露后被直接获得。但攻击者不但拥有数据量巨大的密码字典,而且建立了很多MD5原文/密文对照数据库,能快速地找到常用密码的MD5密文,是破译MD5密文的高效途径。然而,MD5密文数据库所使用的是最常规的MD5加密算法:原文-->MD5-->密文。因此,我们可以使用变换的MD5算法,使现成的MD5密文数据库无所作为。


  下面演示一些变换算法的例子
      当然,在其它的Web开发语言中,也大同小异,完全能得到相同的结果。

变换一:循环MD5

  最容易理解的变换就是对一个密码进行多次的MD5运算。自定义一个函数,它接受$data和$times两个形参,第一个是要加密的密码,第二个是重复加密的次数。实现这种变换有两种算法——

//迭代算法
function md5_1_1($data, $times = 32)
{
    //循环使用MD5
    for ($i = 0; $i         $data = md5($data);
    }
    return $data;
}

//递归算法
function md5_1_2($data, $times = 32)
{
    if ($times > 0) {
        $data = md5($data);
        $times--;
        return md5_1_2($data, $times); //实现递归
    } else {
        return $data;
    }
}
?>

变换二:密文分割MD5

  尽管用户的密码是不确定的字符串,但是只要经过一次MD5运算后,就会得到一个由32个字符组成的字符串,这时可以再针对这个定长字符串变换。有点BT的算法是,把这段密文分割成若干段,对每段都进行一次MD5运算,然后把这堆密文连成一个超长的字符串,最后再进行一次MD5运算,得到仍然是长度为32位的密文。

//把密文分割成两段,每段16个字符
function md5_2_1($data)
{
    //先把密码加密成长度为32字符的密文
    $data =  md5($data);
    //把密码分割成两段
    $left = substr($data, 0, 16);
    $right = substr($data, 16, 16);
    //分别加密后再合并
    $data = md5($left).md5($right);
    //最后把长字串再加密一次,成为32字符密文
    return md5($data);
}

//把密文分割成32段,每段1个字符
function md5_2_2($data)
{
    $data =  md5($data);
    //循环地截取密文中的每个字符并进行加密、连接
    for ($i = 0; $i         $data .= md5($data{$i});
    }
    //这时$data长度为1024个字符,再进行一次MD5运算
    return md5($data);
}
?>

  当然,这种密文分割的具体算法是数之不尽的,比如可以把原密文分割成16段每段两字符、8段每段4字符,或者每一段的字符数不相等……

[1] [2] 下一页  



Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn