Способы защиты пользовательских данных?

Приветствую!

Предположим, что в базе «живут» некие пользовательские данные. Необходимо максимально деперсонализировать и защитить эти данные. Важное условие — возможность работать с этими данными (сортировать, искать), т.е. это не файл, содержимое которого можно зашифровать и положить, а зачем расшифровывать клиентским ключом. Какие способы вы знаете? Самый простой способ это, конечно, хранить минимум информации о самом пользователе, тем самым «очистив» данные, но хотя бы email знать необходимо (например, для регистрации).
  • Вопрос задан
  • 6646 просмотров
Пригласить эксперта
Ответы на вопрос 7
Carcharodon
@Carcharodon
люблю криптографию
То, что не нужно — не хранить. То, что нужно хранить:
— шифровать. (как вариант, можно использовать прозрачное шифрование, как в Oracle или MS-SQL — для приложений ничего не изменится).
— хранить хэши.
— хранить токены (ссылки) (отдельные таблицы для соответствия (токен-данные), данные которых будут шифроваться).
Ответ написан
Комментировать
xenon
@xenon
Too drunk to fsck
Дополнительно к вышесказанному — попробовать изолировать их, хранить на отдельном сервере DB (чтобы на нем ничего не крутилось, через что поломать могут) и либо строго залимитировать доступ правами СУБД (если субд позволяет такое), либо вообще прямой доступ к базе отключить (только с локалхоста), а работа с ней — через свой API (хотя бы в виде простого PHP скрипта) который может иметь функции только для нужных операций.

Например, посчитать всех пользователей из города Урюпинск. (выдает цифру, но не дает сами данные по пользователям).
Если нужно именно получение данных из базы (напр всех данных по пользователю), тот же API может выдавать их, но не более 100 пользователей за день для одного оператора. Этого достаточно для работы, но нельзя будет «высосать» всю базу через «SELECT * FROM table».
Ответ написан
Комментировать
@moonsly
Оставить в БД/файлах в открытом виде только те данные, по которым нужен поиск (сделать их индексами). Поиск по зашифрованным данным без индексов вряд ли возможен.
Остальные данные шифровать/расшифровывать по ключу, либо если для данных нужна только проверка соответствия (пароли) — то MD5 или аналогичный хеш.
Ответ написан
Комментировать
mrstrictly
@mrstrictly
Один из вариантов — разбивать персональные данные по таблицам ключ-значение, где ключ — случайное сгенерированное значение, значение — элемент персональных данных (телефон, паспортные данные, адрес и т.п.). Далее эти таблицы при желании можно двигать, перемещая их, например, в отдельный «как-бы-более-защищенный» инстанс. При особой паранойе, внешний ключ к персональным данным, который хранится в таблице с пользователем, может шифроваться и перешифровываться в соответствии с заданной политикой. Таким образом, запрос на выборку персональных данных начинает выглядеть так:

select a.*, p.* from account a join personal_data p on a.encrypted_pdata_fk = encrypt(p.id, <соль>):
Ответ написан
Комментировать
sevka_fedoroff
@sevka_fedoroff
Можно зашифровать по столбцам. Т.е. на каждый столбец отдельный ключ. В таком случае можно искать, правда только по целому значению, а не с помощью LIKE.
Примерно так:
select * from user where email = AES_ENCRYPT($email,$email_key)

Ключи храним где-то в укромном месте.
Ответ написан
Комментировать
kenny_opennix
@kenny_opennix
Может быть зашифровать базу данных? тогда уже никто не доберется :)
Ответ написан
Комментировать
@joneleth
Слишком размыто. От чего защищаемся-то?
Ответ написан
Ваш ответ на вопрос

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

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