我有一个Web服务,我们的客户需要使用的参数之一是自定义密钥。这个键是sha1的哈希
eg:
bce700635afccfd8690836f37e4b4e9cf46d9c08
然后当客户端调用我们的Web服务时,我必须检查一些事情:
现在我的问题是:
我有一个问题:
$sql = "SELECT permission, is_active FROM clients WHERE sha1(concat(id,key)) = '" . mysql_real_escape_string($key) . "'";
我做对了吗?还是有更好的方法? 感谢
答案 0 :(得分:10)
这种方法很昂贵,因为每次运行此查询时,MySQL都必须检查clients
中的每条记录,并计算其id
和{{1}的SHA-1哈希值}。 (我假设key
有多行,或者至少,你想使用支持clients
有多行的情况的方法。)
为什么不添加一个名为(例如)clients
的新字段?您可以使用trigger来填充字段,并在其上添加index。这种方法应该更好地执行更多。
编辑添加:您提到客户端除了传递此SHA-1哈希外,还必须提交用户名和密码?我不知道你的表结构是什么样的,但我猜测首先根据用户名找到客户端记录更有意义,然后比较特定记录的SHA-1哈希,而不是尝试通过SHA-1哈希查找记录。
答案 1 :(得分: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