微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 使用这个自定义散列函数,我有没有明显的安全漏洞?

<?PHP
function md7($text, $len)
{
  if($text)
  {
   $split = str_split(md5($text).md5(strlen($text)).md5($len), 5);
    foreach($split as $key=>$value)
    {
      $md5 = $md5.md5($value);
    }
    $split2 = str_split($md5);
    foreach($split2 as $kl=>$vl)
    {
      if($kl < $len)
      {
        $digest = $digest.$split2[$kl];
      }   
    }
    return $digest;
  }
} // end md7 function
?>

我创建了这个函数来使用md5和一个可变长度哈希,我相信这减少了碰撞的几率,我已经测试了MD5碰撞的例子并且没有为这个函数创建碰撞,而且这个函数我相信不受彩虹表攻击的影响.

解决方法:

以下是一些明显的安全漏洞:

if($text)

“0”和“”都返回相同的哈希值.

foreach($split as $key=>$value)
{
  $md5 = $md5.md5($value);
}

您正在散列第一个哈希的每个字母.使用$len< = 32,这将使得你对md5($value)的第一个字母相同的所有字符串具有完全相同的哈希值,从而将熵从128位降低到4.这是一个$len = 32的所有16个哈希值的完整列表:

8f14e45fceea167a5a36dedd4bea2543
92eb5ffee6ae2fec3ad71c777531578f
a87ff679a2f3e71d9181a67b7542122c
e4da3b7fbbce2345d7772b0674a318d5
c81e728d9d4c2f636f067f89cc14862c
8277e0910d750195b448797616e091ad
0cc175b9c0f1b6a831c399e269772661
45c48cce2e2d7fbdea1afc51c7c6ad26
4a8a08f09d37b73795649038408b5f33
e1671797c52e15f763380b45e841ec32
eccbc87e4b5ce2fe28308fd9f2a7baf3
c4ca4238a0b923820dcc509a6f75849b
8fa14cdd754f91cc6554c9e71929cce7
c9f0f895fb98ab9159f51fd0297e236d
1679091c5a880faf6fb5e6087eb1b2dc
cfcd208495d565ef66e7dff9f98764da

请注意,选择$len>不会减轻此问题. 32.你仍然只会使用原始哈希的第二个字母,它会给你4位以上的熵(现在最多8位),等于256个不同的哈希值.

我很确定你需要32 ^ 32的长度来匹配原始md5的熵.这是一个非常大的数字.

如果安全性是您想要的,那么请使用定义良好且经过良好测试的散列函数. PHP具有sha1功能以及hash功能中的许多其他功能.

哈希函数通常由加密社区创建和审查.它们比你提出的几乎任何简单的hack要好得多,所以不要实现自己的散列函数,而是使用其中一个可用的散列函数.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐