Я занимаюсь разработкой локальной системы интрасети на PHP / MySQL для управления данными наших клиентов. Похоже, что наилучшей практикой будет шифрование конфиденциальных данных на сервере MySQL во время их ввода.
Я не уверен, однако, о том, что было бы лучшим способом сделать это при сохранении доступности данных.
Это трудный вопрос: где хранятся ключи? Как лучше защитить ключ? Если ключ хранится на компьютере каждого пользователя, как его защитить, если компьютер эксплуатируется? Если ключ используется, как изменить ключ?
Если ключ хранится в БД, как его там защитить? Как бы пользователи получили к нему доступ?
mysql
encryption
stormdrain
источник
источник
Ответы:
На самом деле нет никаких встроенных функций MySQL для обработки сложных настроек зашифрованных ключей. Вам нужно будет реализовать большую часть логики шифрования в своем собственном коде PHP и / или на стороне браузера (javascript?).
Но ваши высказанные опасения немного странны: кажется, что ваши единственные настоящие опасения - это инъекция SQL или атака грубой силой (я полагаю, паролем) с удаленного клиентского рабочего стола / ноутбука. Это заставляет меня подозревать, что у вас уже запланированы некоторые другие, не упомянутые меры безопасности, и вы проанализировали возможные пути компромисса.
Во-первых, я предполагаю, что у вас есть правила брандмауэра, защищающие хост MySQL / PHP от любого доступа с неутвержденных IP-адресов удаленных клиентов. Если я прав, то имеет смысл, что вы беспокоитесь только об атаках с рабочих мест скомпрометированных пользователей.
Кроме того, я предполагаю, что вы понимаете, что если злоумышленник на удаленном клиентском хосте может перейти к привилегированным учетным записям root / Admin или напрямую скомпрометировать собственную учетную запись реального пользователя, то данные этого клиента имеют нулевую защиту независимо от шифрования или любых других мер защиты. (Злоумышленник может прочитать ключи оттуда, где они сохранены на диске, или отследить их, когда реальный пользователь вводит их при входе в систему, а ключи ведут к данным.)
Исходя из этих двух предположений, для нас имеет смысл сделать вывод, что единственными двумя соответствующими угрозами являются: A) угадывание паролем и B) попытки внедрения SQL:
Теперь поговорим о том, как шифрование на стороне сервера применяется в следующих ситуациях:
С другой стороны, шифрование на стороне клиента фактически делает атаки с использованием перебора паролей неактуальными. Вы не можете грубо заставить правильно построенный ключ. Шифрование на стороне клиента поддерживает в основном тот же уровень защиты от внедрения SQL, что и шифрование на стороне сервера. Клиент может передать ключ серверу при входе в систему, сохраняя копию в памяти до завершения сеанса, что увеличивает нагрузку на крипто-процессор на сервере. Или клиент может самостоятельно обрабатывать шифрование / дешифрование в браузере. Есть взлеты и падения к обеим методам:
Наконец, я хочу отметить, что существуют некоторые серьезные недостатки в шифровании данных в базе данных. Поскольку зашифрованные представления данных являются в основном случайными образцами, базовые функции базы данных, такие как индексация, объединения и т. Д., Работать не будут. Клиент берет на себя огромную логическую нагрузку и может потерять много преимуществ, которые обычно предоставляют функции базы данных.
источник
Возможно, вы захотите взглянуть на ezNcrypt , который использует ecryptfs, средства управления доступом и управление ключами, чтобы обеспечить высокую безопасность и производительность для шифрования Linux баз данных MySQL и других процессов. Нет, я не работаю на них.
источник
Вы могли бы использовать Scytale. Это крипто-прокси NoSQL для современных СУБД и веб-приложений. Поддерживает многопользовательское и групповое шифрование. Загружен сильной криптосистемой RSA / AES. Это также на 100% бесплатно и с открытым исходным кодом.
https://bitbucket.org/maximelabelle/scytale
источник