gpt4 book ai didi

php - 安全字符串比较功能

转载 作者:IT王子 更新时间:2023-10-28 23:45:36 24 4
gpt4 key购买 nike

我刚刚在 Zend Framework 的 HTTP Auth 库中看到这段代码。它似乎使用了一种特殊的字符串比较功能来使其更安全。但是,我不太理解这些评论。谁能解释为什么这个函数比 $a == $b 更安全?

/**
* Securely compare two strings for equality while avoided C level memcmp()
* optimisations capable of leaking timing information useful to an attacker
* attempting to iteratively guess the unknown string (e.g. password) being
* compared against.
*
* @param string $a
* @param string $b
* @return bool
*/
protected function _secureStringCompare($a, $b)
{
if (strlen($a) !== strlen($b)) {
return false;
}
$result = 0;
for ($i = 0; $i < strlen($a); $i++) {
$result |= ord($a[$i]) ^ ord($b[$i]);
}
return $result == 0;
}

最佳答案

看起来他们正试图阻止 timing attacks .

In cryptography, a timing attack is a side channel attack in which the attacker attempts to compromise a cryptosystem by analyzing the time taken to execute cryptographic algorithms. Every logical operation in a computer takes time to execute, and the time can differ based on the input; with precise measurements of the time for each operation, an attacker can work backwards to the input.

基本上,如果比较正确密码和错误密码所花费的时间不同,那么您可以使用计时来计算出您猜对了密码的多少个字符。

考虑一个极其有缺陷的字符串比较(这基本上是正常的字符串相等函数,添加了明显的 wait):

function compare(a, b) {
if(len(a) !== len(b)) {
return false;
}
for(i = 0; i < len(a); ++i) {
if(a[i] !== b[i]) {
return false;
}
wait(10); // wait 10 ms
}
return true;
}

假设您提供了一个密码,并且(始终)输入一个密码需要花费一些时间,而输入另一个密码则需要大约 10 毫秒的时间。这告诉你什么?这意味着第二个密码比第一个密码多了一个字符。

这让您可以进行电影黑客攻击——您可以一次猜测一个字符的密码(这比猜测每个可能的密码要容易得多)。

在现实世界中,还有其他因素,所以你必须尝试很多很多次密码来处理现实世界的随机性,但你仍然可以尝试每个字符的密码,直到一个明显花费更长的时间,然后从两个字符的密码开始,依此类推。

这个函数在这里还有一个小问题:

if(strlen($a) !== strlen($b)) { 
return false;
}

它让您可以使用计时攻击来计算出密码的正确长度,这样您就不必费心去猜测任何更短或更长的密码。一般来说,you want to hash your passwords首先(这将创建等长字符串),所以我猜他们不认为这是一个问题。

关于php - 安全字符串比较功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10576827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com