Я не знаю, имеет ли смысл шифровать данные с помощью хэша пароля пользователя, особенно , если вы храните сам хэш в базе данных. В этом случае любой, кто может получить доступ к зашифрованным данным, также может получить доступ к хэшу пароля и расшифровать данные.
Другой подход заключается в шифровании данных с помощью специального ключа приложения, в который добавлены некоторые пользовательские данные. Однако тогда вы сталкиваетесь с другой проблемой: как надежно хранить ключ приложения. На этот вопрос я не знаю простого ответа, но хранение его в исходном коде, вероятно, достаточно хорошо, если вы боитесь, что данные вашей базы данных могут быть скомпрометированы, но не сам исходный код, например. если ваша база данных хранится вне сайта (например, Amazon S3).
Добавление ключа приложения к паролю пользователя помогает, если вы храните только хэш пароля в базе данных, но может привести к еще одной уязвимости: вы должны сохранять пароль пользователя открытым текстом в сеансе приложений.
Что касается технического решения, оно довольно простое, и образец кода доступен . Вы можете изменить его следующим образом, чтобы зашифровать данные с помощью пароля приложения, в который добавлен хеш пароля:
INSERT INTO secure_table VALUES (
1,
AES_ENCRYPT(
'plain text data',
CONCAT(@application_password, @user_password))
);
В любом случае вам придется где-то хранить пароль приложения, поэтому я не думаю, что существует простой подход, обеспечивающий абсолютную безопасность.
Другой подход, который я могу придумать, - попросить пользователя ввести короткий PIN-код, который можно использовать в качестве ключа шифрования. ПИН-код не будет храниться в базе данных, , но , вам потребуется запрашивать его каждый раз, когда вы получаете доступ к его данным.
И, конечно, вы должны подумать о возможности шифрования. Вы не сможете индексировать или искать его без расшифровки. Это, вероятно, требуется для ограниченного набора данных (например, номер кредитной карты), но я бы не стал вдаваться в подробности.