Обратный запрос хеша - PullRequest
       7

Обратный запрос хеша

10 голосов
/ 29 ноября 2011

У меня есть веб-сервис, и один из параметров, который нужно использовать нашим клиентам, это пользовательский ключ.этот ключ является хешем sha1

eg:
bce700635afccfd8690836f37e4b4e9cf46d9c08

, тогда, когда клиент вызывает наш веб-сервис, мне нужно проверить несколько вещей:

  • клиент активен
  • клиент может отправить через веб-сервис и сервис

Теперь моя проблема заключается в следующем:

У меня есть запрос:

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

Я правильно поступаю?или есть лучший способ?спасибо

Ответы [ 2 ]

10 голосов
/ 29 ноября 2011

Этот подход дорог, поскольку каждый раз, когда вы запускаете этот запрос, MySQL должен будет проверять каждую запись в clients и вычислять хэш SHA-1 из id и key. (Я предполагаю, что clients имеет более нескольких строк или, по крайней мере, вы хотели бы использовать подход, который поддерживает случай, когда clients имеет более нескольких строк.)

Почему бы вам не добавить новое поле с именем (скажем) id_key_sha1? Вы можете использовать триггер , чтобы заполнить поле, и добавить к нему index . Этот подход должен выполнять намного лучше.

Отредактировано, чтобы добавить: Вы упоминаете, что клиент, помимо передачи этого хэша SHA-1, также должен предоставить имя пользователя и пароль? Я не знаю, как выглядит структура вашей таблицы, но я предполагаю, что было бы более целесообразно сначала найти запись клиента на основе имени пользователя, а затем сравнить хэш SHA-1 для этой конкретной записи, а не пытаться найти запись по хешу SHA-1.

0 голосов
/ 29 ноября 2011

Вы не должны применять функцию в своем столбце 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
...