ユーザーのパスワードハッシュを使用してデータを暗号化することに意味があるかどうかはわかりません。特に ハッシュ自体をデータベースに保持する場合。その場合、暗号化されたデータにアクセスできる人は誰でも、パスワードハッシュにアクセスしてデータを復号化できます。
別のアプローチは、いくつかのユーザー固有のデータでソルトされたアプリケーション固有のキーを使用してデータを暗号化することです。ただし、別の問題に直面します。それは、アプリケーションキーを安全に保存する方法です。その質問に対する簡単な答えはわかりませんが、データベースデータが危険にさらされる可能性があることを恐れている場合は、ソースコードにそれを保持することでおそらく十分ですが、ソースコード自体は危険にさらされません。データベースがオフサイトに保存されている場合(Amazon S3を考えてみてください)。
アプリキーをユーザーのパスワードでソルトすると、データベースにパスワードのハッシュのみを保持する場合に役立ちますが、別のセキュリティ上の欠陥が発生する可能性があります。アプリケーションセッションでユーザーのパスワードをクリアテキストで保持する必要があります。
技術的な解決策としては、非常にシンプルでサンプルコードが利用可能です 。次のように変更して、パスワードハッシュでソルトされたアプリケーションパスワードを使用してデータを暗号化できます。
INSERT INTO secure_table VALUES (
1,
AES_ENCRYPT(
'plain text data',
CONCAT(@application_password, @user_password))
);
いずれにせよ、アプリケーションのパスワードをどこかに保存する必要があるので、完璧なセキュリティを提供する簡単なアプローチはないと思います。
私が考えることができるもう1つのアプローチは、暗号化キーとして使用できる短いPINをユーザーに要求することです。 PINはデータベースに保存されませんが、 データにアクセスするたびに、ユーザーに確認する必要があります。
そしてもちろん、あなたが考えなければならないのは暗号化の実現可能性です。復号化せずにインデックスを作成したり検索したりすることはできません。限られたデータセット(クレジットカード番号など)に必要になる可能性がありますが、私はそれについては詳しく説明しません。