Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 30.09.2015 13:10:05

Проверка UNIQUE среди зашифрованных записей.

Здравствуйте!
Есть в базе поле для телефона, телефон хранится в зашифрованном виде (зашифрован с помощью Crypt::encrypt). Подскажите, пожалуйста, как можно провести валидацию на уникальность при добавлении нового номера? Можно было бы с помощью того же Crypt::encrypt, но он на один и тот же номер генерирует разный шифр.

Не в сети

#2 30.09.2015 13:54:27

Re: Проверка UNIQUE среди зашифрованных записей.

Хранить параллельно ещё одно поле с хэшем, например, md5(phone) или sha1(phone) (естественно, параметр phone — декодированный). encrypt() выдаёт всегда разный результат для одинаковых строк, поэтому его в виде индекса использовать нельзя.

UPD: но тут, естественно, нужно после phone добавить ещё какую-то случайную строку (соль), иначе все ваши закодированные телефоны можно относительно легко и быстро подобрать через это поле. md5("$phone-cO2mgpvikmHESdA")

Не в сети

#3 30.09.2015 14:28:27

Re: Проверка UNIQUE среди зашифрованных записей.

Большое спасибо за ответ! Да, способ интересный. Почему-то мне он в голову не пришёл. smile Скажите, а это вообще правильный ход? Ну, хранить телефон в шифрованном виде? Я просто переживаю об номерах, на которые могут слать спам в случае утечки базы.
Нет, шансы самой утечки малы, но думаю лучше перестраховаться.

Не в сети

#4 30.09.2015 14:39:00

Re: Проверка UNIQUE среди зашифрованных записей.

  1. Ну, хранить телефон в шифрованном виде?

Отличный ход, если пароли хэшируют, то почему не шифровать другие личные данные?

Здесь только два недостатка:

  1. Шифрование выдаёт строку минимум 48-64 байта, то есть если телефон у вас занимает 10 байт (символов), то так он будет занимать в 6-7 раз больше. Обычно это не проблема, если у вас не миллионы записей, хотя и в этом случае железо у вас точно выдержит чуть больший рамер БД.
  2. Гораздо серьёзней, что к таким полям нельзя применять стандартные функции SQL. Например, если у вас зашифрованный текст, то сделать field LIKE '%something%' уже будет нельзя — нужно расшифровывать все записи и искать в каждой. Для многих полей это не критично, если вам нужно только идентичный поиск (как с телефонами или какими-то кодами) — делаете хэш, который постоянный для одинаковых строк, и сравниваете его, как будто это пароль.

Не в сети

#5 30.09.2015 15:05:24

Re: Проверка UNIQUE среди зашифрованных записей.

Ну тогда хорошо. smile Буду шифровать.

Шифрование выдаёт строку минимум 48-64 байта, то есть если телефон у вас занимает 10 байт (символов), то так он будет занимать в 6-7 раз больше.

Это не страшно. На миллионы записей я не рассчитываю, такого не будет.

что к таким полям нельзя применять стандартные функции SQL

Да это тоже не сильно мешает. Поиск по телефонам я делать не буду. Нет нужды. Шифровать намерен только телефоны, ибо только они "уязвимы".

Большое спасибо за ответ! Буду действовать.

Не в сети

#6 30.09.2015 16:40:58

Re: Проверка UNIQUE среди зашифрованных записей.

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

Не в сети

#7 30.09.2015 16:44:53

Re: Проверка UNIQUE среди зашифрованных записей.

Спасибо. smile

Не в сети

Подвал раздела