Подтвердить что ты не робот

Каков наилучший способ хранения конфиденциальных данных в MySQL?

Я управляю базой данных MySQL из PHP-скриптов. связь между сервером и клиентом обеспечивается через SSL. Я храню данные учетной записи пользователя, которые чувствительны.

Есть ли способ зашифровать эти данные при вводе в БД? Каков наилучший способ защитить эти конфиденциальные данные?

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

Каков наилучший способ его достижения?

Спасибо

4b9b3361

Ответ 1

Серьезно, НЕ ИСПОЛЬЗУЙТЕ MySQL aes_encrypt(). Это самый небезопасный метод использования блочного шифрования. Он использует режим ECB, и я могу привести простой пример демонстрации, почему это является серьезной ошибкой.

Обычное текстовое сообщение:

alt text

То же сообщение, зашифрованное в режиме ECB (неважно, какой шифр вы используете): alt text

ТОЧНОЕ же сообщение с использованием режима CBC (опять же, неважно, какой шифр вы используете): alt text

Есть еще больше причин не использовать mysql aes_encrypt, в первую очередь каждый отправленный вами запрос также будет иметь ключ aes, который вы используете. Если база данных скомпрометирована, злоумышленник включит ведение журнала и просто получит ваш ключ aes и расшифрует всю базу данных.

Итак, что вы должны использовать? Мне нравится этот класс. Он использует режим CBC с функцией String2Key и IV. Вы можете использовать первичный ключ как ваш IV, каждое сообщение должно иметь уникальный IV. Это нормально, если злоумышленник знает IV, и если они последовательны, , пока реализация блочного шифрования безопасна. Повторное использование IV, сделанного WEP гораздо менее безопасен.

Ответ 2

В MySQL существуют функции шифрования,

http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html

Например, вы можете использовать aes_encrypt() для хранения данных в зашифрованном виде.

Однако в этих функциях есть некоторая слабость,

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

  • Нет ключевой информации, поэтому очень сложно повернуть клавиши.

Ответ 3

Есть несколько основных способов сделать это (если вы не предоставите более подробную информацию о том, что вы хотите выполнить).

  • Отключить удаленный доступ.
  • Отслеживать журнал доступа MySQL.
  • Требовать использования strong и защищенных паролей с конца клиента.
  • Перед сохранением в базе данных удалите ВСЕ свой пользовательский ввод.
  • Настройте свой php для обеспечения безопасности. (register_globals, safe_mode и т.д.)
  • Использовать встроенные функции шифрования mysql, как указано. http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html

Если вы защищаете от хакеров-хакеров, это должно быть хорошо. Снова мне нужно, чтобы вы указали немного подробнее.

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

Ответ 4

Существует слишком подробная информация для действительно полезного ответа, но вот общие случаи:

Если вы храните пароли, где вы должны проверить правильность ввода данных, но вам не нужны исходные данные, вы можете сохранить хэш (SHA1/SHA2). Просмотрите все действия для хэширования, чтобы сделать это правильно.

Если вам нужно прочитать исходные данные, вы можете использовать функции шифрования. Хорошим выбором для симметричного шифрования является AES. Однако проблема здесь становится ключевым управлением. Где вы храните свой ключ, который используется для шифрования/дешифрования? Это очень распространенная проблема, и в зависимости от контекста это разные решения.