我们希望创建一个 Web API,用户在购买我们的软件许可证时通过电子邮件接收哈希 token (196 位),然后可以使用此 token 将其试用软件版本激活为“完整”软件。 Web API 负责接收哈希 token 并确认或拒绝用户升级到完整版本。
省略大量关于此的细节,似乎以这种方式接收哈希 token ,然后仅使用 SQL SELECT 检查该 token 是否在数据库中会暴露定时攻击。攻击者可以尝试通过测量响应时间来猜测数据库中 token 中的各个字节。
如何防范这种情况?一般而言,特别是在 Ruby on Rails 中。
到目前为止的想法:
- 实现恒定的查找时间(如何实现?)
- 添加随机噪声(多少?)
- 将 token 拆分为关键部分(32 位)和其余部分。仅对 key 执行查找,并对其余 key 进行安全比较
最佳答案
我的工作解决方案使用第二个索引 token_key 字段,它是 token_hash 的前 8 个字节:
def valid_token(given_token_hash)
# don't look for hash, because of SQL timing attacks
token_key = given_token_hash[0,8]
token = ActivationToken.find_by_token_key(token_key)
# Even if not found in database, we should pretend to take some time
token_hash = token.nil? ? "123e4567-e89b-12d3-a456-426655440000" : token.token_hash
if (!secure_compare(token_hash, given_token_hash))
return nil
end
return token
end
关于sql - 针对哈希 token 的 SQL SELECT 定时攻击的对策,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26077553/