Intereting Posts
Многомерное хранилище массивов CodeIgniter в одной колонке базы данных mysql .htaccess url закодированная строка, не переходящая на страницу правильно Из имени строки класса можно получить статическую переменную? Функция почты PHP работает иногда PHP foreach с вложенным массивом? php require_once или включить внутри HTML head tag не помещает код внутри головы, а в тело Загружать несколько файлов на сервер с php, не загружая на сервер все файлы Сессии Отказоустойчивость с PHP-memcache против memcached Справка по импорту csv PHP – Десятичные значения становятся округленными значениями при вставке в таблицу Корреляция URL-адресов PHP, сохраняющая недопустимые URL-адреса Вызов функции PHP заполнение выпадающего окна, основанное на выборе другого раскрывающегося списка с использованием php, mqsql и ajax PHP-декодирование JSON Zend Framework 2 – Doctrine 2 – Создана в поле timestamp Не удается получить токен доступа с Google Calendar Api v3

Как безопасно хранить конфиденциальные данные в базе данных MySQL?

Я делаю заявку на работу для компании, в которой я работаю. У меня есть защита от SQL-инъекций и некоторых методов XSS. Моя основная проблема заключается в том, чтобы обеспечить конфиденциальную конфиденциальную информацию, такую ​​как SSN и адрес, потому что компания нуждается в том, чтобы сделать 1099 форм для налогов продавцов.

Я не знаю, как сделать эту часть, но должен ли я шифровать все, а затем расшифровывать ее, когда она попадает в базу данных MySQL?

Это слишком упрощенный ответ, и его следует принимать с солью, поскольку большинство ответов о безопасности:

  • Использовать SSL везде.

  • Используйте защищенный ключ шифрования

Для хранения зашифрованных данных вы можете использовать поле BLOB и использовать встроенные функции шифрования MySQL. Пример:

 update mytable set myfield = AES_ENCRYPT('some value', SHA2('your secure secret key', 512)); 

Если вы предпочитаете делать шифрование / дешифрование в коде приложения, взгляните на функции Mcrypt PHP.

  • Шифровать ввод пользователя
  • Сохранить в базе данных
  • Расшифруйте его после извлечения

Это далеко не полное руководство, но это начало и лучше, чем ничего не делать.

Вы можете узнать больше на https://security.stackexchange.com/

SQL-запрос с ключом в нем (как предлагает Уэсли Мерч) – не очень хорошая идея. Если вы это сделаете:

 update mytable set myfield = AES_ENCRYPT('some value', 'your secure secret key'); 

… и запрос регистрируется (slowlog for inst.) ваш секретный секретный ключ фиксируется в виде обычного текста, чего никогда не должно быть. Такой запрос с секретным ключом также будет отображаться при запуске запроса, например SHOW PROCESSLIST .

Следующая проблема, где хранить защищенный ключ? В PHP-файле? Это снова простой текст.

Шифрование данных:

Используйте шифрование частного / открытого ключа ( http://en.wikipedia.org/wiki/Public-key_cryptography ). PHP имеет неплохую поддержку.

  • Открытые ключи могут храниться вместе с пользователем в базе данных, они общедоступны.
  • Закрытый ключ можно зашифровать с помощью пароля пользователя. Когда пользователь входит в систему, вы дешифруете закрытый ключ и храните его в своих файлах cookie (если вы используете SSL, это не так плохо) или сеанс. Оба не идеальны, но лучше обычного текста в php-файле.
  • Используйте открытый ключ для шифрования, закрытый ключ для дешифрования.
  • Только пользователь будет иметь доступ к своим данным.

Если вы хотите узнать больше, вы можете использовать Google «пользовательское шифрование» или «нулевую конфиденциальность информации».

Вставка SQL / XSS:

Лучшая защита – это безопасное приложение. Без сомнений. Если вы хотите его защитить, вы можете использовать для inst PHP IDS для обнаружения атак: https://github.com/PHPIDS/PHPIDS

У меня неплохой опыт.

Как видно из комментариев, вы задаете огромный вопрос. Вам нужно будет изучить ряд отдельных вопросов:

  • SQL-инъекция и способы ее предотвращения
  • XSS и как его предотвратить
  • шифрование представленных данных формы с использованием SSL
  • рекомендации по хранению конфиденциальной информации в базе данных

Трудно было бы рассмотреть их все в одном ответе. Я бы предложил выполнить некоторые поиски на этом сайте по темам, упомянутым выше.