针对散列令牌SQL SELECT的定时攻击的对策

Chr*_*bek 5 sql api hash timing

我们想要创建一个Web API,用户在购买我们的软件许可证时通过电子邮件接收散列令牌(196位),然后可以使用此令牌激活他们的试用软件版本到"完整"软件.Web API负责接收哈希令牌并确认或拒绝用户升级到完整.

遗漏了大量关于此的细节,似乎以这种方式接收哈希令牌,然后只是检查SQL SELECT,如果此令牌在数据库中,则会暴露定时攻击.攻击者可以通过测量响应时间来尝试从数据库中的令牌中猜测单个字节.

怎么防范这个?一般而言,特别是在Ruby on Rails中.

目前为止的想法:

  • 实现查找的恒定时间(如何?)
  • 添加随机噪音(多少?)
  • 在关键部分(32位)和余数中拆分令牌.仅在密钥上执行查找,并在其余部分进行安全比较

Chr*_*bek 5

我的工作解决方案使用第二个索引的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
Run Code Online (Sandbox Code Playgroud)