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

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

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

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

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

благодаря

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

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

    alt text

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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