Соль SHA в запросе MySQL

0

Я устанавливаю cookie. Что-то вроде:

$_COOKIE['test'] = SHA1('124'.'mysalt');

Теперь 124 - это мой идентификатор, который я хочу. Поэтому в моей таблице MySQL я пытаюсь запустить такой запрос, как:

$sql = ("SELECT * FROM users WHERE SHA1(`id`) = '".mysql_real_escape_string($_COOKIE['test'])."'");

Как добавить "mysalt" в SQL-запрос? Потому что иначе я хочу получить правильный идентификатор.

Теги:
sha1
salt

4 ответа

4
Лучший ответ

Для этого используйте Concat().

SELECT ... Sha1( Concat(`id`, 'mysalt') )=...
  • 0
    Имейте в виду: в этом случае MySQL не может использовать индекс для ускорения поиска. Возможно, было бы лучше добавить другое поле в таблицу, чтобы вы могли запросить что-то вроде SELECT ... WHERE id = 124 AND tempkey = '87gesafouvgbaesofiuigsaf'
1

Решения, которые уже были предоставлены, вероятно, будут работать очень хорошо, однако вы уверены, что хотите это сделать? Если поле "id" действительно является отдельной идентификацией, вы можете использовать "LIMIT 1", чтобы остановить mysql от поиска по всем вашим элементам. Другое дело, почему вы не используете для этого отдельное предварительно вычисленное поле? Я имею в виду, что в каждом запросе mysql излишне нужно вычислить все эти значения sha1. Последнее. Я не знаю, почему вы используете свой подход, но я думаю, что это нужно, чтобы реализовать какой-то ключ сеанса. Я считаю, что это плохая идея по нескольким причинам: если кто-то держится за вашу соль, у него есть доступ ко всем вашим аккаунтам. Если кто-то нюхает один "сеанс", он может использовать его всякий раз, когда захочет. Выбор слабой соли может иметь серьезные последствия. НТН.

1

Запрос должен быть:

$sql = ("SELECT * FROM users WHERE SHA1(CONCAT(`id`,`mysalt`)) = '".mysql_real_escape_string($_COOKIE['test'])."'");

если я правильно понимаю, что вы пытаетесь сделать.

  • 0
    не проверял новые ответы, пока я слишком долго отвечал, мой плохой.
  • 1
    Это будет некрасиво и приведет к падению производительности по мере роста таблицы users , поскольку MySQL придется вычислять SHA1(CONCAT('id', 'mysalt')) каждый раз, когда выполняется запрос. Попробуйте добавить новый столбец id_hash содержащий SHA1(CONCAT('id', 'mysalt')) , проиндексировать его и поместить фильтрацию вашего запроса в id_hash = mysql_real_escape_string($_COOKIE['test'])
0

Используйте CONCAT:

$sql = ("SELECT * FROM users WHERE SHA1(CONCAT(`id`,'mysalt')) = '".mysql_real_escape_string($_COOKIE[''test''])."'");
  • 0
    Почему ОП должен использовать concat?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню