編集:わかりました、私はここで答えをいくらか見つけました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)