sql - 针对哈希 token 的 SQL SELECT 定时攻击的对策

标签 sql api hash timing

我们希望创建一个 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/

相关文章:

objective-c - 遍历矩阵的哈希函数

mysql - 用一个sql更新两个不同表中的列

php - 通过 PHP 连接到另一个网络上的 SQL DB

api - 嵌入没有媒体的推文

api - 如何设计 RESTful 高级搜索/过滤器

java - 了解 Twitter API

c++ - 如何为 std::vector<std::vector<bool>> 编写哈希函数

SQL Server 2008 区分大小写的唯一列

mysql - 仅当父值不为 NULL 时才根据父 ID 更新单元格

.net - 找出两个列表之间的差异