データベース内の機密性の高いデータを保護したいのですが。これは、データが暗号化され、敵の手に渡った場合、100年間安全である必要があることを意味します。また、RAMの平文で一度に脆弱なデータの量を制限したいと思います。これにより、プレーンテキストデータがディスクにページングされる可能性が低くなります。また、データベースは非常に大きい場合があるため、データベースにアクセスするためだけにデータベース全体を一度に復号化するよりも効率的である必要があります。したがって、データベースの行レベルで機密データを暗号化することを考えています。これは、レコードを参照する一意のインデックスが暗号化されていないため、各レコードを引き続き検索/取得できますが、機密データ自体は暗号化されています。
私の解決策は、データベースの行ごとにデータを持つことです:
index | IV | sensitive encrypted data | MAC
システムはシングルユーザーです。ユーザーは強力な英数字のパスフレーズ(最小19文字)を作成します。
パスワードベースのキー導出関数がパスフレーズで実行され、導出された暗号化キーが作成されます。これは、Twofishでデータベースキーを個別に暗号化するために使用されます。これは、ユーザーがデータベース全体を再暗号化せずにパスワードを変更できるようにするためです。代わりに、新しいパスワードを作成してデータベースキーを再暗号化するだけです。これがスキームの最も弱い部分であることは理解していますが、攻撃者がパスワードの推測をブルートフォース攻撃することを非常に困難にしたいと思います。暗号化されたデータを保持するデバイスと同時にあらゆる種類のセカンダリトークンが危険にさらされる可能性があるため、セキュリティはパスフレーズの強度に依存する必要があると思います(デバイスとトークンは任意の理由で没収される可能性があると考えています)空港のセキュリティを通過するため、無駄になります)。
プログラムが読み込まれると、ユーザーはパスフレーズを入力します。 KDFが実行され、データベース暗号化キーを復号化するためのキーが生成されます。プログラムが実行されている間、実際の暗号化キーはRAM=に保持される唯一のものであり、必要に応じて個々のデータベースレコードを検証および復号化するために使用されます。
行レベルIVの最適な長さは? 256ビットでいいですか?
答えは、プレーンテキストの一部が既知であるか、攻撃者が簡単に推測できるかによって異なります。質問では、データは「非常に機密」であり、保護期間は「100年」であると説明されているため、暗号化に便利な最強の暗号と最大の秘密を使用します。
19文字の最小パスワード強度とPBKDF2の10,000回の反復は、256ビットデータベースキーを保護するのに十分強力ですか?そうでない場合、どのパラメータが機能しますか?
文字数に対する答えは、検証中にパスワードに課せられた規則を知らなければ決定できません。
PBKDF2はまだここで使用するのに良いアルゴリズムですか?そうでない場合、どのScryptパラメータですか?
回答が存在します これは、bcryptまたはPBKDF2に関する優れた背景情報を提供します。
システムを安全にするためのさらなる変更または推奨事項はありますか?
はい。たくさんの。ここにいくつかあります。