【问题标题】:Is possible to find a string that satisfy this condition?是否可以找到满足此条件的字符串?
【发布时间】:2017-10-13 13:58:15
【问题描述】:
$myStr = $_GET['myStr'];
if ($myStr == md5($myStr)) echo "ok\n"; 

我知道代码中有一个类型,但在我的测试中我找不到满足条件的输入。

【问题讨论】:

  • 这是非常基本的事情,你只需要做一些研究就可以了
  • md5,同一个标签列表中的安全性和密码学有点危险......这些天md5不应该用于与安全性有关的任何事情
  • 不明白你想要什么。你在“md5($myStr)”之后忘记了一个“)”
  • 修复了代码!

标签: php security cryptography md5


【解决方案1】:

不,您找不到 myStr 值,因为它归结为为 MD5 找到(一级)原像。虽然 MD5 已经因为抗碰撞而被破坏,但你应该找不到原像。更多信息here.

我假设您的代码相当于找到y = md5(y)y = md5(x) 是一个更一般的假设,在上面链接的维基百科文章中描述,即使对于 MD5,也无法找到这样的 H(x)


这并不意味着您应该使用 MD5。请使用 SHA-256、SHA-512 或实际上是 SHA-3 函数之一。就算MD5没破那么远,也已经破得不能再用了; “攻击总是会变得更好;它们永远不会变得更糟。”

【讨论】:

    【解决方案2】:

    让我们从头开始。我将提供一个示例,以便我可以帮助您更好地理解。

    在第一行你有$myStr = $_GET['myStr']; 我只是假设你会像这样从你的 url 中获取这个变量:

    http://localhost/md5Project.php?myStr=test
    

    这将为您的变量 $myStr 赋予值“test”。

    在你的 if 语句中前进:

    if ($myStr == md5($myStr)
    

    这永远不会是真的,因为 $myStr 的值是 "test"md5($myStr) 的值是 098f6bcd4621d373cade4e832627b4f6 所以基本上你将 2 个字符串与值 "test""098f6bcd4621d373cade4e832627b4f6problem" 进行比较,这总是会导致错误。

    【讨论】:

    • 永远不会是真的? stackoverflow.com/questions/235785/…
    • @Progrock 是 从不 因为除其他外,“测试”是 4 个字节,MD5 输出是 16 个字节:两者的长度不同,所以永远不会相等。
    • @zaph OP 从未规定输入将是“测试”。
    • 无论输入是什么,我在回答中都解释了为什么它们永远不会匹配。
    • @Progrock 答案确实如此,这就是您的回应。
    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多