2012-03-13 3 views
2

正しいパスワードで動作している文字列を復号化したい。私はif(decrypt(Password, encryptedKey).contains(Key)){とパスワードを確認しようとしましたが、PWが間違っている場合、私は次の例外を取得:復号化の前にパスワードを確認する

javax.crypto.BadPaddingException: pad block corrupted 

ので、パスワードを確認する方法はありますか?

public static String decrypt(String seed, String encrypted) throws Exception { 
    byte[] rawKey = getRawKey(seed.getBytes()); 
    byte[] enc = toByte(encrypted); 

    SecretKeySpec Spec = new SecretKeySpec(rawKey, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.DECRYPT_MODE, Spec); 


    byte[] result = cipher.doFinal(enc); 

    return new String(result); 
} 
+1

誤ったパスワードを使用して復号化(および例外をスロー)するのではなく、正しいパスワードを使用して復号化する場合は、何が問題なのですか?実際に解読するよりも簡単にパスワードを確認する方法はありません(少なくとも*するべきではありません)。 – Piskvor

+0

私はtryとcatchを使用する必要がありますか? – Droider

答えて

2

誤ったパスワードを使用して解読(および例外をスロー)しないが、正しいパスワードを使用して解読すると、何が問題?実際に解読するより簡単な方法として、パスワードを確認する簡単な方法はありません(であってはいけません):ショートカットの存在は攻撃者がターゲットにできる弱点を提供します(「なぜドアマンの下にパスワードヒントがありますか? ")。

例外なく復号化する場合、パスワードは正しいです。例外が発生した場合、パスワードは間違っています。

これは書式的には(例外的に例外を使用する例外を使用する場合と同様に)最適ではないかもしれませんが、データの横にパスワードを保存するなど、システムのセキュリティを低下させません(保存の前にパスワードをハッシュするとですが、間違ってしまうのは簡単ですし、セキュリティを低下させながらシステムの複雑さを増やします(複雑さの味についてはthisなどを参照してください)。

+0

です。あなたは私に確信しました。 – Droider

+2

この例外は、間違ったパスワードの信頼できる指標ではありません。言い換えれば、不正なパスワードは、有効なパッドブロックがランダムに発生することがあります。特に、パディングの量が1〜2バイトにすぎない場合には、そうです。 –

+0

@GregS:フェアポイント。 OPはおそらく解読された出力が意味があるかどうかをチェックするべきです - 間違ったパスワードを使ったIIRC解読(パディングを壊していなくても)はガベージを出すべきでしょうか? – Piskvor

2

これは、プログラムが入力パスワードと比較するために、パスワードをどこかに保存する必要があることを意味します。ハッカーのためにバックドアを作成したくない場合は、保存したパスワードをハッシュする必要があります。

+0

ありがとう、ありがとう。この文字列はファイルの1行であるため、MD5暗号化で暗号化されたファイルにパスワードを保存します。 – Droider

+0

システムのセキュリティが弱いため、パスワードのハッシュを保存しないでください。復号より潜在的に簡単です。 –

+0

@RomanPlášil平文パスワードを保存するのではなく、 – Andreas

関連する問題