web-dev-qa-db-ja.com

JavaでJSONオブジェクトを暗号化する最良の方法は何ですか?

JSON配列があります。

JsonArray people;

人を表すJSONオブジェクトを保持します。

現在、それらをjsonファイルにプレーンテキストとして保存しています。

try {
    OutputStream out = new FileOutputStream('storage.json');
    JsonWriter writer = Json.createWriter(out);
    writer.writeArray(people);
    writer.close();
} 

しかし、私はこれらのファイルを暗号化して、それらを解読する鍵がなければ価値がないようにしたいと思っています。

これを行う最良の方法は何ですか? JSON配列オブジェクトを暗号化する必要がありますか、それとも書き込む前に配列全体を暗号化できますか?これを行うために使用すべき最も推奨されるJava暗号関数は何ですか?

1
Curious1

これを行うには多くの方法があります。

私は、JSON内のコンテンツを暗号化するのではなく、ファイルレベル全体でJSONを暗号化します。代替手段は複雑で、意味のあるセキュリティ上の利点はありません。私はAEAD暗号を使用することをお勧めします(現在の推奨事項は、GCMを使用したAES-256:別名AES/GCM/NoPaddingを256ビットキーで使用しています)。 GCMを使用するには、Java 8以降である必要があります。OracleJREでAES-256を使用するには、 Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Filesが必要です。 ドキュメントどおりにインストールされています。

場所と使用に関する情報を含むように認証タグを設定し(実際のファイル名が適切な出発点です)、他のバージョンの名前の変更や置き換えを困難にする必要があります(保存時のリプレイ攻撃の形式)。

ただし、JSONコンテンツの暗号化は完全なソリューションではありません。ボールを少し動かすだけです。攻撃者がまだ秘密キーへのプレーンテキストアクセスを持っている場合、それは効果がありません。

秘密鍵の平文を保護するには、別のシステムでKMS(鍵管理サービス)を使用できます。これにより、暗号化されたJSONファイルを使用して、マシン上のメモリアクセスから秘密鍵を保護します。暗号化されたファイルコンテンツをKMSに送信して、ロード時に復号化するか、ストアでその逆を行います。

これらを配置すると、オフライン攻撃(ディスクイメージ分析、マシンイメージ分析、バックアップ盗難、メディア盗難など)からファイルを効果的に保護できます。さらなる防御がなければ、ファイルのコンテンツは依然としてマシン自体のメモリのオンライン攻撃の影響を受けます。

4
Alain O'Dea

ファイル全体を暗号化してから、通常どおりファイルに書き込むのが最適です。読書についても同じです。以下は、stackoverflowの例です。

https://stackoverflow.com/questions/5632658/how-to-encrypt-or-decrypt-a-file-in-Java

0
Robert Jacobs