私のWebアプリのデータベースには機密データが保存されています。攻撃者がデータベースにアクセスできる場合、攻撃者はこのデータにアクセスできません。それが、データベース内のこの機密データを暗号化したい理由です。
最初に、ユーザーのユーザー名またはパスワードをキーとしてユーザーデータを暗号化したいと考えました。このアプローチの問題は、ユーザーがユーザー名とパスワードを変更できることです。ユーザーがユーザー名を変更した場合、アプリケーションは古いユーザー名で暗号化されたデータを解読できなくなります。また、攻撃者はユーザーのユーザー名にアクセスできます。したがって、これは非常に安全なソリューションではありません。
私が持っている唯一の他のアイデアは、1つのグローバルキーですべてのユーザーデータを暗号化することです。これの1つの欠点は、システム全体が1つのキーに依存することです。このシナリオでは、新しいキーと古いデータに互換性がないため、キーを変更できません。
この問題についてもっと良いアイデアはありますか?
一般的に受け入れられているアプローチは、AndrolGenhaldが 以前の回答 で提案したものと似ていますが、いくつかの機能が強化されています。
パスワードから導出されたキーを使用して、各ユーザーのデータを個別に暗号化できます。 しないでくださいが、パスワードをキーとして直接使用したい場合。これは、次のように複数ステップのプロセスです。
1)CSPRNGmを使用してランダムキーを生成し、このランダムキーを使用してユーザーのデータを暗号化します。ユーザーごとに新しい異なるランダムキーを作成できます。これはDEKまたはデータ暗号化キーと呼ばれます。
2)ユーザーのパスワードを取得し、適度に高い作業係数または反復回数とランダムソルトを使用してPBKDF(PBKDF2、bcrypt、またはscryptなど)で実行し、2番目のキー、KEKまたはキー暗号化を作成します。キー。次に、KEKを使用してDEKを暗号化し、暗号化されたDEKとソルトをデータベースに保存します。
次に、ユーザーがログインするときに、データベースのパスワードとソルトを使用してKEKを再生成します。KEKを使用してDEKを復号化し、データを復号化できます。
これで、ユーザーがパスワードを変更したときに、すべてのデータを復号化して再暗号化する必要がなくなり、新しいパスワード(および新しいソルト)を使用して新しいKEKを生成し、これを使用してDEKを再暗号化します。新しいKEK。
次のいずれかを行うことができます。
ユーザー名だけをキーとして使用することはお勧めしません。ユーザー名を暗号化して保存したとしても(少し極端に思えます)、ユーザー名は通常、秘密とは見なされません。
ユーザーの情報を暗号化したい場合、それはデータベースに保存されます。同じデータベースのデータを復号化するためのキーを保存しないことをお勧めします。より厳格なアクセスポリシーを使用して、他の場所に保管されている機密情報でコンテンツを暗号化します。このように、攻撃者はそのデータを取得するためにキーストアとデータベースの両方にアクセスできる必要があります。これは攻撃面を広げます。