徐善通的随笔

千里之行, 始于足下



PHP使用hash_equals函数防止时序攻击


php5.6中新增了一个函数hash_equals

函数原型

hash_equals ( string $known_string , string $user_string ) : bool

该函数的作用是使用一个已知的字符串, 来和用户输入的字符串进行比较,

无论结果如何, 该函数的耗时总是相同的, 从而避免了时序攻击

时序攻击

那么什么是时序攻击呢?

我们在日常使用中, 如果使用==比较两个字符串, 他是按位进行比较的, 也就是从第一位开始, 一位一位的对比, 发现不同立即返回false, 那么只要计算出比较的速度, 大概就可以知道从哪个位开始不同, 这样就可以通过时间差值来进行按位破解

使用场景

一般用在比较验证码和密码上比较多, 以及涉及到安全的地方都可以使用

注意事项

Note:

要想成功进行比较,那么所提供的 2 个参数必须是相同长度的字符串。 如果所提供的字符串长度不同,那么本函数会立即返回 FALSE, 在时序攻击的场景下,已知字符串的长度可能会被泄露。

Note:

非常重要的一点是,用户提供的字符串必须是第二个参数。

如果所提供的 2 个参数中任何一个不是字符串, 会导致 E_WARNING 消息。

参考: https://www.php.net/manual/zh/function.hash-equals.php


作者: 徐善通
地址: https://www.xstnet.com/article-149.html
声明: 除非本文有注明出处,否则转载请注明本文地址


我有话说



最新回复


正在加载中....

Copyrights © 2016-2019 醉丶春风 , All rights reserved. 皖ICP备15015582号-1