2013-02-25 5 views
9

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

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

+0

Если вы хотите, чтобы он был защищен, он должен быть зашифрован в базе данных MySQL не только во время транзита. – Jon

+0

Если он может быть расшифрован вами, его можно вообще расшифровать тем, кто имеет доступ к вашей базе данных. Может быть, вам нужно нанять профессионала? – sjdaws

+0

Это ужасно широкий вопрос, Джейкоб. Можете ли вы сосредоточить его еще? Если вас больше интересует сквозное шифрование (почему? Для обеспечения конфиденциальности? Чтобы ваши пользователи доверяли, что они отправляют данные в нужную единицу?), Затем извлеките другие биты. Какова ваша предыстория в этой области? Если этого мало, то позвольте мне смиренно предположить, что вы делаете какое-то автономное чтение - любая помощь, которая может вписаться в ответ SO, не поможет. [OWASP] (https://www.owasp.org/index.php/Category:OWASP_Guide_Project) - хорошее место для начала. –

ответ

9

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

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

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

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

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

Если вы предпочитаете делать шифрование/дешифрование в коде приложения, посмотрите на Mcrypt функций РНР.

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

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

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

+0

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

+0

Вы должны были объяснить шифрование лучше, это действительно важно, и, как разработчики, наша задача - обеспечить безопасность. Отметьте [это] (http://stackoverflow.com/questions/16600708/how-do-you-encrypt-and-decrypt-a-php-string/30159120#30159120) ответ на вопрос, у него действительно хороший руководство по шифрованию. – dspacejs

+0

Лучше не использовать mcrypt, он является отказом, не обновлялся годами и не поддерживает стандартное дополнение PKCS # 7 (née PKCS # 5), только нестандартное нулевое заполнение, которое нельзя даже использовать с двоичным данные. В mcrypt было много выдающихся [ошибок] (https://sourceforge.net/p/mcrypt/bugs/), относящихся к 2003 году. Вместо этого подумайте об использовании [defuse] (https://github.com/defuse/php-encryption), он поддерживается и является правильным. – zaph

1

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

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

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

5

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

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

... и запрос получает вход (slowlog для инст.) Ваш безопасный секретный ключ захватывается в виде обычного текста, который никогда не должно произойти. Такой запрос с секретным ключом будет также отображаться при запуске запроса, например, 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

У меня неплохой опыт работы с ним.

Смежные вопросы