【问题标题】:Why md5('240610708') is equal to md5('QNKCDZO')? [duplicate]为什么 md5('240610708') 等于 md5('QNKCDZO')? [复制]
【发布时间】:2014-04-04 02:44:08
【问题描述】:
var_dump(md5('240610708') == md5('QNKCDZO'));

输出:

bool(true)

示例: http://3v4l.org/2vrMi

【问题讨论】:

  • 使用 "===" 你会得到false
  • 它们不一样(php 可能正在将它们转换为整数并进行整数比较→改用===
  • 我无法在这里回答,但您的两个部分似乎都有0^(x),其中x 是哈希的下一部分。这样,0e123 被解释为 int:0^123。所以,0^y==0^x 代表任何x,y>0。所以,你得到了输出true

标签: php md5


【解决方案1】:

md5('240610708') 的结果是0e462097431906509019562988736854

md5('QNKCDZO') 的结果是0e830400451993494058024219903391

它们都是浮点数格式字符串数字字符串),如果你在php中使用==,当比较一个数字和一个字符串或者比较涉及到数字字符串,然后将每个字符串转换为数字并以数字方式进行比较。

==比较时,两个字符串都转换为0,如果你想将它们作为字符串进行比较,请记住使用===(严格比较)。 p>

见:PHP expresses two different strings to be the same

【讨论】:

  • 在很多情况下,散列也应该在恒定时间内进行比较(尤其是在 MAC 的上下文中以验证密文)。所以 == 错误并不重要,因为您永远不应该将 == 用于安全敏感的哈希比较。
  • @ScottArciszewski 真的吗?用伪随机字符串 B 学习常量伪随机字符串 A 的前缀大小对攻击者的真正意义是什么?
  • 如果你知道 M 和 HMAC(M, K),并且你想为 M' 找到一个有效的 HMAC(M', K),你可以发送你的 M' 并使用时序信息来构建无需知道 K 的有效 HMAC 输出。
  • 有一篇关于这个安全漏洞的好文章,它还解释了如何使用数组绕过 strcmp:marcosvalle.github.io/ctf/php/2016/05/12/…
【解决方案2】:

您需要使用类型敏感的比较运算符===

哈希值分别为0e4620974319065090195629887368540e830400451993494058024219903391。当您使用== 时,由于e(科学记数法),每个都转换为数字表示,因此它们每个都变为00 == 0 是真的。

另一方面,这个:

md5('240610708') === md5('QNKCDZO')

返回 false,因为 string 值不同。 === 强制类型敏感的比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-16
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2013-03-08
    • 2011-03-11
    • 1970-01-01
    相关资源
    最近更新 更多