【问题标题】:Reverse hash lookup query反向哈希查找查询
【发布时间】:2012-01-08 11:05:14
【问题描述】:

我有一个网络服务,我们的客户需要使用的参数之一是自定义键。此键是 sha1 的哈希

eg:
bce700635afccfd8690836f37e4b4e9cf46d9c08

那么当客户调用我们的网络服务时,我必须检查几件事:

  • 客户端处于活动状态
  • 客户端是否可以通过 webservice 和 service 提交

现在我的问题是:

我有一个问题:

$sql = "SELECT permission, is_active FROM clients WHERE sha1(concat(id,key)) = '" . mysql_real_escape_string($key) . "'";

我做对了吗?还是有更好的方法? 谢谢

【问题讨论】:

  • 你基本上是在使用密钥作为会话ID吗?如果是这样,您可以考虑改用 PHP 会话。非常简单和安全。 php.net/manual/en/features.sessions.php
  • @JonathanM 不,密钥是客户端 id + 随机密钥的 sha1(我们本地存储在表中)并且我们提供给客户端。因此,当我们调用我们的站点时,他需要使用它,例如:ws.domain.com/bce700635afccfd8690836f37e4b4e9cf46d9c08 AND 他发布用户名和密码以及其他变量;
  • @ErinTucker:如果哈希中包含随机键,那么您的查询为什么只有sha1(id)
  • @ruakh 哎呀我忘了谢谢

标签: mysql sha


【解决方案1】:

这种方法代价高昂,因为每次运行此查询时,MySQL 都必须检查clients 中的每条记录并计算其idkey 的SHA-1 哈希值。 (我在这里假设clients 有不止几行,或者至少,您想使用一种支持clients 有不止几行的情况的方法。)

为什么不添加一个名为(比如)id_key_sha1 的新字段?您可以使用trigger 来填充该字段,并在其上添加index。这种方法应该执行得更好

编辑添加:你提到客户端除了传入这个 SHA-1 哈希之外,还必须提交用户名和密码?我不知道您的表结构是什么样的,但我猜首先根据用户名查找客户端记录,然后比较该特定记录的 SHA-1 哈希值会更有意义,而不是尝试通过 SHA-1 哈希查找记录。

【讨论】:

    【解决方案2】:

    你不应该将函数应用到你在 mysql 中进行过滤的 LHS 列中,
    这使得 mysql 无法使用索引进行比较。

    一个例子将允许在索引上使用:-

    where key = SHA1(CONCAT(id, :key))
    
    // where the :key = user submitted api key
    // and in this case mysql able to fetch the matched rows via index
    

    【讨论】:

      猜你喜欢
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      相关资源
      最近更新 更多