Электронные адреса в БД в зашифрованном виде на PHP, как реализовать?

Всем доброго времени суток!
Я занимаюсь разработкой на PHP уже довольно давно, но с криптографией работал очень мало. И вот передо мной встала такая вот задача.
Есть в базе MySQL таблица `users`. В таблице есть поля: `uid` - id пользователя и `email` - адрес электронной почты пользователя.
Мне нужно написать php (используя только, общераспространенные модули php, например Mcrypt) код который:
  • хранит все электронные адреса в зашифрованном виде
  • должна быть возможность искать пользователей по домену их email адресов
  • использовать дополнительные поля или другие таблицы БД нельзя

Често говоря даже не знаю с какой стороны подступить к этой задаче. Подскажите как такое можно реализовать.
  • Вопрос задан
  • 973 просмотра
Пригласить эксперта
Ответы на вопрос 3
@nirvimel
использовать дополнительные поля нельзя

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

1. Изначально разбирать емейл на юзернейм и домен.

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

3. Писать в базу строки такого вида:
sprintf("%s_%s", base64_encode($encripted_domain), base64_encode($encripted_username));

4. Осуществлять выборку с фильтрацией по домену так:
sprintf("SELECT * FROM table WHERE email LIKE \"%s_%%\" ", base64_encode($encripted_domain));

5. Восстанавливать исходный емейл так:
list($domain_base64, $username_base64) = explode("_", $encripted_email_from_db);
$decripted_email = sprintf("%s@%s", decript_function(base64_decode($username_base64)), decript_function(base64_decode($username_base64)));

Тут decript_function - пользовательская функция расшифровки.
Ответ написан
Комментировать
@Wol_fi
php, js, mysql, highload
https://dev.mysql.com/doc/refman/5.5/en/encryption... например, можно шифровать внутри базы.
Что то типа - INSERT INTO table VALUES (AES_ENCRYPT(email))
Выбирать - SELECT AES_DECRYPT(email)
Но для поиска по домену, лучше отдельный столбец создавать.
Ну или получится мега-долгий поиск, вида WHERE AES_DECRYPT(email) LIKE '%domain'
Ответ написан
Комментировать
A8333093
@A8333093 Автор вопроса
Интересное предложение, спасибо. А можно чуточку поподробнее?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы