为什么md5('240610708')等于md5('QNKCDZO')?

43

3
使用 "===" 运算符,结果为 false - user180100
2
它们不相同(php 可能会将它们转换为整数并进行整数比较 → 使用 === 代替) - knittl
1
我无法在这里回答,但是似乎你的两个部分都有 0^(x),其中 x 是哈希的下一个部分。这样,0e123 被解释为整数:0^123。 因此,对于任何 x,y>0,都有 0^y==0^x。所以,你得到了输出 true - Egor
2个回答

65

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

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

它们都是浮点数格式字符串数字字符串),如果您在php中使用 == 进行比较时,当比较涉及到数值字符串或数值与字符串的比较时,每个字符串都会被转换为数值,然后进行数值比较。

当使用 == 进行比较时,两个字符串都被转换为 0。如果您想将它们作为字符串进行比较,请记得使用 ===严格比较)。

参见:PHP expresses two different strings to be the same


5
在许多情况下,哈希值也应该进行常数时间比较(特别是在用于验证密文的MAC的情境中)。因此,“==”漏洞并不是关键,因为您永远不应该使用“==”来进行安全敏感的哈希比较。 - Scott Arciszewski
@ScottArciszewski 真的吗?攻击者从学习常数伪随机字符串A与伪随机字符串B的前缀大小中真正获得了什么? - Niklas B.
如果你知道 M 和 HMAC(M, K),并且想要找到一个对于M'有效的HMAC(M', K),你可以发送你的 M' 并使用时间信息来构建一个有效的 HMAC 输出,而无需知道K。 - Scott Arciszewski
3
有一篇关于这个安全漏洞的好文章,它还解释了如何通过使用数组来绕过strcmp:https://marcosvalle.github.io/ctf/php/2016/05/12/php-comparison-vlun.html - baptx

18

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

这两个哈希值分别为0e4620974319065090195629887368540e830400451993494058024219903391。当你使用==时,由于其中的e(科学计数法),它们都被转换为数字表示形式,所以它们都变成了00 == 0是真的。

另一方面,这个:

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

由于字符串的值不同,返回false===强制进行类型敏感比较。


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