1

私はJavaで簡単なパスワードマネージャーを書こうとしています。AES 256ビット暗号化を使用して、保存されているパスワードでファイルを暗号化したいのですが。さらに、ユーザーがパスワードを使用してファイルを復号化できるようにしたいと思います。オンラインで他の投稿を読むとき、それらのほとんどすべては、単にパスワードをキーとして使用することは安全ではないことを強調し、セキュリティを追加するためにランダムソルトを使用することに言及しています。しかし、キーを生成するときにランダムソルトを使用する方法がわかりません。ユーザーのパスワードとランダムなソルトからキーを作成した場合、ユーザーがファイルを復号化しようとすると、ソルトが何であるかをどのように知ることができますか?これは私を完全に混乱させます。

現在、私は各ステップで一定のソルトを使用して、いくつかの異なるハッシュを介してパスワードを実行しています。これは十分に安全ですか、それとも何かが足りませんか?パスワードからキーを安全に生成する方法についてのヘルプをいただければ幸いです。前もって感謝します。

4

2 に答える 2

8

塩は秘密ではないことを忘れないでください。暗号化されたデータに追加するだけです。塩のポイントは、暗号化されたファイルを「解読」する方法として、誰かが一般的なパスワードで暗号化された一般的なデータの事前に計算された辞書を使用するのを防ぐことです。

ソルトがランダムであることを確認し、それをパスワードと組み合わせることで、ハッカーが「ソルト+パスワード」で事前に暗号化されたデータのデータベースを持つ可能性が(事実上)ないため、辞書攻撃の可能性を排除します。(最初に、パスワードベースの暗号化のソルトについて、私のチュートリアルの1つからこのページを参照してください。)

また、(効果的に)衝突の問題を排除します。2つのファイルで同じパスワードを使用すると、両方のファイルで発生する同じデータブロックが暗号化されたバージョンで同じように見える場合、攻撃者にコンテンツの手がかりを与える可能性があります。

ただし、通常のパスワードには通常多くのエントロピーが含まれていないため、通常は他の予防策を講じる必要があります。。たとえば、8つの完全にランダムな小文字は、約40ビットのエントロピーを生成します。英語の典型的なパターンに従う8つの小文字は、約20ビットのエントロピーを生成します。言い換えると、2 ^ 256の可能なキーのうち、実際には、一般的なユーザーは2 ^ 20-2^40の範囲の小さな部分から選択します。精通したユーザーの場合、状況は少し良くなりますが、256ビットのエントロピーに近づく可能性はほとんどありません。(「パスフレーズ」では、1文字あたり約2.5〜3ビットのエントロピーがあることを考慮してください。したがって、30文字のパスフレーズでは約75ビットのエントロピーが得られます。正直なところ、何人の人が何かを使用していますか。 30文字のパスワードのように?;印刷可能なASCIIの「フル」範囲を使用する8つの完全にランダムな文字は、64ビット弱になります。)

この状況を少し緩和する1つの方法は、計算が複雑な一方向性関数を使用してパスワードを変換し(ソルトを追加)、ハッカーが推測したい各キーを試すのに少し時間がかかるようにすることです。繰り返しになりますが、詳細についてはこのページを参照してください

パスワードベースのファイル暗号化の落とし穴の大まかなアイデアを提供するために、数年前に作成したArcmexerライブラリを確認することもできます。このライブラリにはisProbablyCorrectPassword()という名前のメソッドが含まれています。候補パスワードを生成するための辞書/アルゴリズムと組み合わせて、上記の方法の有効性を評価するために使用できます(ZIPファイルの暗号化はこれらの手法の組み合わせを使用するため)。

于 2012-11-14T04:22:46.277 に答える
1

このライブラリを使用してください:http ://www.jcraft.com/jsch/

良いAESの例があります:

http://www.jcraft.com/jsch/examples/AES.java.html

Maven、Eclipseなど、多くの有名人がこのパッケージを使用しています。

于 2012-11-14T03:07:08.427 に答える