10

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

eg:
bce700635afccfd8690836f37e4b4e9cf46d9c08

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

  • 客户是否活跃
  • 客户端是否可以通过 webservice 和 service 提交

现在我的问题是:

我有一个疑问:

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

我在做正确的事吗?还是有更好的方法?谢谢

4

2 回答 2

10

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

为什么不添加一个名为 (say) 的新字段id_key_sha1?您可以使用触发器来填充字段,并在其上添加索引。这种方法应该表现更好。

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

于 2011-11-29T02:45:47.477 回答
0

您不应该将函数应用到在 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
于 2011-11-29T03:03:21.600 回答