Java 6?で使用するパスワードベースの暗号化方法はどれですか?可能な限り強力である必要がありますが、デフォルトのセキュリティポリシーファイルで動作します(ダウンロードする必要があるエクスポート制限付きのファイルではありません)別にインストールします)?
私の推奨:パスワードベースの暗号化の使用を避けるようにしてください (できる限り回避できる場合)。特に、パスワードベースの暗号化は実際には安全ではない傾向があります。問題は、ユーザーのパスワードが抵抗するのに十分なエントロピーを持つことはまれであることです辞書攻撃。したがって、 暗号化が必要な場合、おそらくパスワードベースの暗号化を使用したくないでしょう (代替手段がある場合)。
より良い解決策は、ユーザーにキーを与え、そのキーを使用して暗号化または復号化することです。
私の推奨に従わない場合:パスワードベースの暗号化を絶対に使用する必要がある場合、リスクをいくらか減らすためのいくつかの提案を次に示します。
PBKDF2 を使用して、パスワードからキーを取得します。鍵の導出プロセスに、たとえばユーザーのマシンで100ミリ秒かかるように、適切に多数の反復を選択します。これにより、ユーザーのパスフレーズで辞書検索を実行するのが少し難しくなります。ただし、リスクが排除されるわけではないため、ユーザーは非常に長いパスフレーズを選択するために余分な労力を費やす必要があります。
ユーザーが非常に長いパスフレーズを使用する可能性を高めるためにできる限りのことをしてください。最善の方法は、パスワードを自動的に生成することです。 80ビットのエントロピーを持つものを選択することをお勧めします。これをA-Za-z0-9(0または1との混同を避けるためにOまたはlではない)を使用するパスワードに変更すると、結果のパスフレーズは14文字になります。ユーザーは、このような長いパスフレーズに対処する必要がない場合がありますが、安全を確保するには、それを吸い取って対処する必要があります。
ユーザーが独自のパスフレーズを選択できるようにすると、ほとんどの場合、品質の低いパスフレーズが選択されます。リスクに関する悲惨な警告を含めることをお勧めします。少なくとも20文字で、ランダムに作成できるパスフレーズを選択することをお勧めします。カットアンドペーストして使用できるサンプルパスフレーズを生成する小さなアプリを提供することもできます。
どんなに努力しても、ユーザーが自分のパスフレーズを選択した場合、多くのユーザーはおそらく十分に安全でないものを選択するでしょう。問題は、暗号化には、Webアカウントのパスワードに使用するパスワードよりもかなり長く強力なパスフレーズが必要なことです。ほとんどのユーザーはおそらくこれを知らないでしょうし、とにかく長くて十分に強いパスフレーズを選択することの煩わしさは、多くのユーザーがそうすることを妨げ、彼らが安全に動作しない原因となるでしょう。
パスワードベースの暗号化が安全に使用するための頭痛の種であるという感覚を得ているなら、あなたの感覚は完全に正確です。
最初に@ D.W。の回答を読んでください。それは良いアドバイスでいっぱいです。次に、パスワードベースの暗号化を引き続き行う場合は、次のことを考慮してください。
パスワードハッシュメカニズムはデータを「隠す」ことがないため、通常、暗号法や輸出規制の対象にはなりません。次に、コードに bcrypt の実装のみを含めることをお勧めします。 jBCrypt これはJavaで記述されており、簡単なライセンスでオープンソースであり、かなりコンパクトです(oneソースファイル)。その実装ではstringsを使用する必要があるため、コードを少し変更する必要がありますが、生のビットが必要です。したがって、次のようにします。
crypt_raw()
メソッドを使用して、パスワードとソルトを192ビットのbcrypt出力に変換します。(私は通常、説明されている理由でPBKDF2よりもbcryptを好みます there ですが、PBKDF2も悪くないので、本当にPBKDF2が必要な場合(またはコンプライアンス上の理由で必要な場合)、それを選択してください。)
重要:暗号化を適切に行い、MACを追加することは、驚くほど多くの方法で失敗する可能性があります。あなたは自分でそれをしないように暖かく励まされています。ただし、次のメソッドは安全である必要があります。
そして、覚えておいてください:決して、決して、[〜#〜]決して[〜#〜]再利用しない2つの暗号化インスタンスのソルト値(同じパスワードを使用するかどうか)。ファイルを暗号化するたびに、常にJava.security.SecureRandom
を使用して新しいランダムソルトを生成します。