Обратный запрос поиска хэша

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

eg:
bce700635afccfd8690836f37e4b4e9cf46d9c08

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

  • активный клиент
  • клиент может отправлять через webservice и службу

теперь моя проблема такова:

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

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

Как я поступаю правильно? или там лучший способ? спасибо

Ответ 1

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

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

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

Ответ 2

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