两个字符串之间的sha256哈希碰撞问题

3

我需要找到通过URL参数传递的两个字符串'str1'和'str2',并满足以下条件:

if($_GET['str1'] !== $_GET['str2'] and $_GET['str1'] and $_GET['str2']) 
{
    $hash1 = hash('sha256', $salt . $_GET['str1']);
    $hash2 = hash('sha256', $salt . $_GET['str2']);

    if($hash1 === $hash2) {
       #print str1 and str2
    }

}

我该怎么找到答案呢?


我们可以尝试使用不同的数据类型吗?这是可能的吗? - Avneet
1
据我所知,目前没有已知的(或者至少是公开的)sha256碰撞。显然,将同样的字符串传递两次可以满足它。基本上,你为什么要问呢?这是一个比赛吗?还是一个思想实验? - iainn
为什么不尝试自己在Google上搜索“break sha hash”并寻找解决方案? - Andreas
@iainn 不是的,第一行说str1和str2严格来说不相同。 - Andreas
1
@Andreas 是的,显然我是个盲人。使用 and 运算符而不是 && 可能也很重要,因为这听起来像是一道竞赛题。 - iainn
显示剩余3条评论
1个回答

7

唯一可能的解决办法是使哈希函数失效。
哈希函数期望字符串输入(或强制类型转换为字符串),因此将输入设为数组将破坏哈希并返回false/不起作用。
这两个意思是严格相同的。

这是一种欺骗,但它满足代码的所有部分,因为目前代码是这样的。

<?php
$_GET['str1'] = ["a"];
$_GET['str2'] = ["b"];
$salt = "aaabdnelnFnekknfn";

if($_GET['str1'] !== $_GET['str2'] and $_GET['str1'] and $_GET['str2']) 
{
    $hash1 = hash('sha256', $salt . $_GET['str1']);
    $hash2 = hash('sha256', $salt . $_GET['str2']);

    if($hash1 === $hash2) {
       var_dump($_GET['str1'],$_GET['str2']);
    }

}

https://3v4l.org/SPYKb


1
这也是为什么在我看来,你不应该使用弱类型语言来实现安全系统的原因之一。如果运行时接受相同输入参数的文本和字节,则情况会变得更糟。哈希函数在上面的示例中正常工作;问题出在类型转换上。 - Maarten Bodewes
这段代码有点作弊。但是可以通过检查输入是否为字符串来轻松修复,如果不是,则不要将其传递给hash()函数。 - Andreas
保护自己的黄金法则:始终对用户输入进行类型、格式、语法、长度等方面的验证。 - Raffael Meier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接