在对我的另一个问题的回答中,注意到在验证加密中检查 HMAC 时使用标准字符串比较函数的类会使该类容易受到针对 HMAC 的定时攻击。
我无法理解这种针对经过身份验证的加密的 HMAC 的定时攻击是如何成为问题的?
首先,攻击者应该知道这些实现(在这种特殊情况下,源只是简单地发布),所以唯一的秘密就是密钥。按照这种推理,实现中的恒定时间比较函数如何防止任何事情发生?(我希望攻击者简单地删除它,如果他甚至会使用相同的代码)。
其次,如果我将实现视为黑盒,则比较是针对具有 PBKDF2 派生密钥的数据的 HMAC。尝试对 HMAC 进行定时攻击不会 a) 与尝试暴力破解受 PBKDF2 保护的密码一样慢 b) 不会真正披露任何有助于尝试解密数据的信息?(HMAC 甚至附加到密文中,可供所有有权访问加密数据的人使用)。
那么,我在这里遗漏了什么,为什么在这种情况下定时攻击被认为是需要防范的风险?
快速更新:
我了解定时攻击的工作原理,但我不明白在解密函数如下所示的场景中使用定时攻击会获得什么:
/**
* @param binary $data Where $data = salt, IV, encrypted data, HMAC(salt, IV, encrypted data)
* @param string $password The decrypt-password
* @return string|null plain text if data was successfully decrypted, null otherwise
*/
function decrypt($data, $password) {
...
}