在php5.6
中新增了一个函数hash_equals
函数原型
hash_equals ( string $known_string , string $user_string ) : bool
该函数的作用是使用一个已知的字符串, 来和用户输入的字符串进行比较,
无论结果如何, 该函数的耗时总是相同
的, 从而避免了时序攻击
时序攻击
那么什么是时序攻击
呢?
我们在日常使用中, 如果使用==
比较两个字符串, 他是按位进行比较的, 也就是从第一位开始, 一位一位的对比, 发现不同立即返回false
, 那么只要计算出比较的速度, 大概就可以知道从哪个位开始不同, 这样就可以通过时间差值
来进行按位破解
使用场景
一般用在比较验证码和密码上比较多, 以及涉及到安全的地方都可以使用
注意事项
Note:
要想成功进行比较,那么所提供的 2 个参数必须是相同长度的字符串。 如果所提供的字符串长度不同,那么本函数会立即返回 FALSE, 在时序攻击的场景下,已知字符串的长度可能会被泄露。
Note:
非常重要的一点是,用户提供的字符串必须是第二个参数。
如果所提供的 2 个参数中任何一个不是字符串, 会导致 E_WARNING 消息。