SQL SHA1 внутри ГДЕ - PullRequest
       13

SQL SHA1 внутри ГДЕ

2 голосов
/ 23 мая 2009

В моей программе мы храним IP-адрес пользователя в записи. Когда мы отображаем список записей для пользователя, мы не хотим передавать IP-адрес другого пользователя, поэтому мы его хэшируем в SHA1. Затем, когда пользователь нажимает на запись, он переходит к URL-адресу, например так:

http://www.example.com/allrecordsbyipaddress.php?ipaddress=SHA1HASHOFTHEIPADDRESS

Теперь мне нужно перечислить все записи по IP-адресу, указанному в хэше SHA1. Я попробовал это:

SELECT * FROM records 
WHERE SHA1(IPADDRESS)="da39a3ee5e6b4b0d3255bfef95601890afd80709"

но это не работает. Как бы я это сделал?
Спасибо, Исаак Уоллер

Ответы [ 6 ]

8 голосов
/ 23 мая 2009

Не знаю, имеет ли это значение, но ваш SHA1 хеш da39a3ee5e6b4b0d3255bfef95601890afd80709 - это хорошо известный хэш пустой строки.

Это просто пример или вы забыли предоставить фактический IP адрес для функции вычисления хеша?

Обновление:

Генерирует ли код вашей веб-страницы SHA1 хэши в нижнем регистре?

Эта проверка не будет выполнена в MySQL:

SELECT  SHA1('') = 'DA39A3EE5E6B4B0D3255BFEF95601890AFD80709'

В этом случае используйте это:

SELECT  SHA1('') = LOWER('DA39A3EE5E6B4B0D3255BFEF95601890AFD80709')

, что получится.

Кроме того, вы можете пересчитать хэш SHA1 при вставке записей в таблицу:

INSERT
INTO    ip_records (ip, ip_sha)
VALUES  (@ip, SHA1(CONCAT('my_secret_salt', @ip))

SELECT  *
FROM    ip_records
WHERE   ip_sha = @my_salted_sha1_from_webpage

Это вернет вам исходный IP и позволит индексировать ip_sha, чтобы этот запрос работал быстро.

4 голосов
/ 23 мая 2009

Я бы сохранял SHA1 IP в базе данных вместе с необработанным IP, чтобы запрос стал

SELECT * FROM records WHERE ip_sha1 = "..."

Тогда я бы позаботился о том, чтобы вычисление SHA1 происходило ровно в одном месте в коде, чтобы не было возможности сделать это немного по-разному в нескольких местах. Это также дает вам возможность смешать соль в расчете, чтобы кто-то не мог просто вычислить SHA1 на интересующем IP-адресе и передать его вручную.

Хранение хэша SHA1 в базе данных также дает вам возможность добавить вторичный индекс в ip_sha1 для ускорения этого SELECT. Если у вас очень большой набор данных, выполнение SHA1 в предложениях WHERE вынуждает базу данных выполнить полное сканирование таблицы, а также повторять вычисления для каждой записи при каждом сканировании.

3 голосов
/ 23 мая 2009

Просто быстрая мысль: это очень простое запутывание. Существует только 2 32 возможных IP-адресов, поэтому, если кто-то, обладающий техническими знаниями, захочет это выяснить, он может сделать это путем вычисления всех 4 миллиардов хешей, что не займет много времени. В зависимости от чувствительности этих IP-адресов, вы можете рассмотреть возможность поиска в частной справочной таблице.

3 голосов
/ 23 мая 2009

Каждый раз, когда у меня возникало неожиданное несоответствие хеширования, это происходило из-за того, что я случайно хешировал строку, включающую некоторые пробелы, такие как "\n".

0 голосов
/ 23 мая 2009

В итоге я зашифровал IP-адреса и расшифровал их на другой странице. Тогда я могу просто использовать необработанный IP-адрес в запросе SQL. Кроме того, он защищает от атак грубой силы, как сказал Самодержавие .

0 голосов
/ 23 мая 2009

Сравнивали ли вы выходные данные вашего хеш-алгоритма с выходными данными MySQL SHA1 ()? Например для IP-адреса 1.2.3.4?

...