【问题标题】:sha256 hash collisions between two strings两个字符串之间的 sha256 哈希冲突
【发布时间】:2019-04-04 11:15:24
【问题描述】:

我必须找到两个作为参数'str1'和'str2'在URL中传递并满足这些条件的字符串?

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
    }

}

我将如何发现?

【问题讨论】:

  • 什么?!我不知道你在说什么!
  • 必须在url中找出满足上述条件的str1和str2才能打印结果,httpurl.php?str1=?&str2=?
  • 您想要两个不同的字符串给出相同的 sha hash?不可能在合理的时间内弄清楚。
  • 据我所知,没有任何已知的(或至少公开的)sha256 冲突。显然两次传递相同的字符串会满足它。基本上,你为什么要问?是比赛吗?思想实验?
  • @Andreas 是的,显然我是盲人。使用and 运算符而不是&& 这一事实可能也很重要,因为这听起来像是一个竞赛问题。

标签: php encryption hash sha256 sha


【解决方案1】:

唯一可能的解决方案是使散列函数不起作用。
散列函数需要字符串输入(或类型转换为字符串),因此将输入作为数组将破坏散列并且两者都返回假/不工作。
这意味着两者是完全相同的。

这是一个作弊,但它满足当前代码的所有部分。

<?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

【讨论】:

  • 在我看来,这也是为什么你永远不应该使用弱类型语言来实现安全系统的原因。如果运行时接受相同输入参数的文本和字节,那么情况会变得更糟。哈希函数在上面的例子中正常工作;应该归咎于杂耍的类型。
  • 代码有点作弊。但是可以通过检查输入是否为字符串来轻松修复,如果不是则不传递给 hash()。
  • 保命的黄金法则:始终根据类型、格式、语法、长度等验证用户输入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 2010-09-12
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2019-05-15
相关资源
最近更新 更多