Java Language
セキュリティ&暗号化
サーチ…
前書き
Javaのセキュリティプラクティスは、2つの広く曖昧に定義されたカテゴリに分けることができます。 Javaプラットフォームのセキュリティー、セキュアなJavaプログラミングを提供します。
Javaプラットフォームのセキュリティプラクティスは、JVMのセキュリティと整合性の管理に対処します。 JCEプロバイダやセキュリティポリシーの管理などのトピックが含まれています。
セキュアなJavaプログラミングのプラクティスは、セキュアなJavaプログラムを作成する最良の方法です。これには、乱数や暗号の使用、脆弱性の防止などのトピックが含まれます。
備考
例を明確にする必要がありますが、カバーする必要のあるトピックは次のとおりです。
- JCEプロバイダのコンセプト/構造
- リストアイテム
JCE
Java Cryptography Extension(JCE)は、開発者がプログラムで暗号を簡単かつ安全に使用できるようにするために、JVMに組み込まれたフレームワークです。これは、JCEプロバイダのシステムを使用して基本的な暗号操作を安全に実装しながら、プログラマにシンプルでポータブルなインターフェイスを提供することで実現します。
キーとキー管理
JCEは暗号操作と鍵生成を保護しますが、実際に鍵を管理するのは開発者次第です。ここで詳しい情報を提供する必要があります。
実行時にキーを処理するための一般的に受け入れられているベストプラクティスの1つは、文字列としてではなく、 byte
配列としてのみ格納することです。これは、Java文字列が不変であり、メモリ内で手動で "クリア"または "ゼロ"にすることができないためです。文字列への参照は削除できますが、メモリのセグメントがガベージコレクションされて再利用されるまで、正確な文字列はメモリに残ります。攻撃者は、プログラムのメモリをダンプして簡単にキーを見つけることができる大きなウィンドウを持っていました。逆に、 byte
配列は変更可能であり、その内容を上書きすることができます。もはやそれらを必要としなくなるとすぐにあなたのキーをゼロにすることは良い考えです。
一般的なJavaの脆弱性
コンテンツが必要です
ネットワーキングの懸念
コンテンツが必要です
ランダム性とあなた
コンテンツが必要です
ほとんどのアプリケーションでは、 java.utils.Random
クラスは「ランダム」なデータの完全なソースです。配列からランダムな要素を選択するか、ランダムな文字列を生成するか、一時的な "一意の"識別子を作成する必要がある場合は、おそらくRandom
使用します。
しかし、多くの暗号システムはセキュリティのためにランダム性に依存しており、ランダムによって提供されるRandom
性は単に高品質ではありません。ランダムな入力が必要な暗号操作の場合は、代わりにSecureRandom
を使用する必要があります。
ハッシュと検証
より多くの情報が必要です。
暗号ハッシュ関数は、3つの重要な特性を持つ関数のクラスのメンバーです。一貫性、一意性、および不可逆性。
一貫性:同じデータが与えられた場合、ハッシュ関数は常に同じ値を返します。すなわち、X = Yの場合、f(x)は常にハッシュ関数fに対してf(y)に等しい。
一意性:ハッシュ関数への2つの入力は、同じ出力をもたらすことはありません。つまり、XとYの任意の値に対して、X!= Y、f(x)!= f(y)ならば、
不可逆性:不可能ではないにしても、ハッシュ関数を「逆転する」ことは非実用的です。すなわち、f(X)のみが与えられれば、元のXが関数f(ブルートフォース)を介してすべての可能な値をとるのを忘れることはできません。 f1(f(X))= Xとなるような関数f1は存在してはならない。
多くの関数には、これらの属性の少なくとも1つがありません。たとえば、MD5とSHA1には衝突があることが知られています。つまり、同じ出力を持つ2つの入力です。そのため、一意性が欠けています。現在セキュアであると考えられる機能の中には、SHA-256とSHA-512があります。