6

編集:わかりました、私はここで答えをいくらか見つけましたBCryptは長いと言います、同様のパスワードは同等です-私、宝石、または暗号化の分野に問題がありますか?

しかし、新しい質問ですが、パスワードをn文字より短くする必要があると言って、ますます複雑になるパスワードを選択するようにユーザーを教育しようとしている世界で、ユーザーのパスワードの長さを制限する必要がある場合、ハッシュにbCryptを使用することをどのように推奨できますか?金曜日のthedailywtf.comのスクリーンショットにたどり着く方法のようです:)

以下の元の質問:

私はアプリケーションの古いログインページをリファクタリングしていて、JAVA実装jBCrypt(http://www.mindrot.org/projects/jBCrypt/)を使用してbCryptに旋回を与えることにし、1つの主要なショーストッパーに遭遇しました。

問題は、非常に長いシードを使用すると常にtrueを返すように見えるcheckpwメソッドにあります。ユーザーのパスワードを{InternalSalt}{username}{password}でソルトし、それをbCryptでハッシュします。

だから私は次のコードを持っています(checkpwを分離するために可能な限りそれを取り除いた)。

public class Test {
public static void main(String[] args) {
    String plaintext = "jw~ct/f61y1m7q458GiLVQpiqDK|8kG=d368Id:D@$^_80I{qrn1HM6423{FtestAccountO1nu3jKN";

    String pw_hash = BCrypt.hashpw(plaintext, BCrypt.gensalt());

    if (BCrypt.checkpw("jw~ct/f61y1m7q458GiLVQpiqDK|8kG=d368Id:D@$^_80I{qrn1HM6423{FtestAccountO1nu3jKN", pw_hash))
        System.out.println("It matches");
    else
        System.out.println("It does not match");

}

}

これは、当然のことながら、「一致します」と出力します。

私が抱えている問題は、checkpwに渡すパスワードにsayaaaを追加して作成することです

BCrypt.checkpw( "jw〜ct / f61y1m7q458GiLVQpiqDK | 8kG = d368Id:D @ $ ^ _ 80I {qrn1HM6423 {FtestAccountO1nu3jKNaaa"、pw_hash)

それでもtrueを返します!正確には私が期待していたものではありません。ドキュメントにパスワードの長さの制限はありませんが、小さいパスワードシードで再現することはできません。また、文字列の末尾以外を変更すると、期待どおりに機能し、falseが返されるように見えます。

私は何か大きなものを逃しましたか?いくつかの調査を行っている間、多くの投稿でBCryptが推奨されているのを見てきたので、これらのフォーラムでjBcryptを使用しているのは私だけではないことを知っています。

編集:Windows 7 64ビット-Java(TM)SEランタイム環境(ビルド1.6.0_24-b07)

4

2 に答える 2

5

さて、質問の言葉遣いは、私が探していたものを実際に理解するのに十分なものでした(ラバーダッキングの万歳)。暗号化の分野は今のところ安全です!

BCrypt実装XORは、最後まで184バイトの整数であるP_origを使用します。これにより、暗号化の「キー」が72バイトに制限されます。72バイト以降のすべては無視されます(警告があれば良かったでしょう)。

容認された妥協案のように見えるのは、ユーザーのパスワードを72文字以下に制限するのではなく、単に黙って通過させることです。この背後にある考え方は、72文字のbCryptedパスワードは、とにかく高速ハッシュの代替手段よりも優れているということです。

出典:BCryptによると、長く似たようなパスワードは同等です-私、宝石、または暗号化の分野に問題がありますか?

于 2011-05-30T19:44:39.010 に答える
2

実際、あなた自身の答えは素晴らしく、厄介な問題を見つけるのに役立ちました;)ハッシュする前にある種のアプリの秘密をプレーンに追加する人のためのヒントがあります(パスワードの長さを制限している場合でも):特に最後にアプリの秘密を含めますアプリのシークレットの長さが72文字の場合、それ以外の場合はすべてのヒットが返されtrueます。

代わりに:

String hashed = BCrypt.hashpw(APP_SECRET + plain, BCrypt.gensalt())

使用する:

String hashed = BCrypt.hashpw(plain + APP_SECRET, BCrypt.gensalt())

Bcryptのトリミングが発生した場合でも、checkpw結果は有効になります。

于 2014-11-08T14:51:25.273 に答える