2011-11-29 82 views
10

我有一个Web服务,我们的客户端需要使用的参数之一是一个自定义键。这关键是SHA1的哈希反向哈希查找查询

eg: 
bce700635afccfd8690836f37e4b4e9cf46d9c08 

然后当客户致电我们的Web服务我要检查几件事情:

  • 是客户主动
  • 的客户端可以通过Web服务和服务
  • 提交

现在我的问题是这样的:

我有一个查询:

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

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

+0

你基本上使用的密钥作为会话ID?如果是这样,你可以考虑使用PHP会话。非常简单和安全。 http://php.net/manual/en/features.sessions.php –

+0

@JonathanM不,密钥是客户端ID +随机密钥(我们本地存储在表中)的sha1,我们给客户端。所以当我们打电话给我们的网站时,他需要使用它,例如:http://ws.domain.com/bce700635afccfd8690836f37e4b4e9cf46d9c08/和他POST用户名和密码和其他变量; –

+0

@ErinTucker:如果散列中包含一个随机密钥,那么你的查询怎么只有'sha1(id)'? – ruakh

回答

10

这种方法是昂贵的,因为,每次运行此查询时,MySQL将必须检查在clients每一个记录,并计算其idkey的SHA-1散列。 (我假设这里clients有超过几行,或者至少,你要使用支持地方clients具有比几排更的情况下的一种方法。)

为什么不你添加了一个叫做(说)id_key_sha1的新字段?您可以使用trigger来保持填充字段,并在其上添加index。这种方法应该更好地执行很多

编辑补充:您提到除了传递这个SHA-1哈希值之外,客户端还必须提交用户名和密码?我不知道你的表结构是什么样的,但我猜测先找到基于用户名的客户端记录,然后比较特定记录的SHA-1哈希值,而不是尝试通过SHA-1哈希查找记录。

+0

对不起,我忘了东西..我更新了我的问题 –

+0

@ErinTucker:我已经更新了我的答案。 – ruakh

+0

谢谢你的回答,我喜欢这个主意 –

0

您不应该将函数应用到您的LHS列中,在mysql中进行过滤,
这使得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