アドレス重版:http://blog.dreamlikes.cn/archives/880
[著作権] このサイト上のコンテンツ は、クリエイティブコモンズ帰属-非営利-同一条件許諾3.0中国本土(BY-NC-SA 3.0 CC CN) と同じ方法で、 ライセンスのために。
ネットワークからのコンテンツやリソースの一部、純粋な研究と研究。あなたの権利を侵害した場合、してください私に連絡し、私はできるだけ早くなります。
:としてはから指定してください再現 Brolyのブログ、記事へのリンク: bcryptの互換性のある暗号化のJavaとPHP(Laravelを)
早期Laravel後端はネイティブの構文を使用して、ユーザーのパスワード暗号化システムを使用して構築されていますpassword_hashを
// $hash = password_hash('broly', PASSWORD_DEFAULT);
$hash = '$2y$10$wO./FnpCf8NkqjXbgV5ZT.juYia/Ts4Fz6ZBZgfWObmOjlAQwKtfO';
if (password_verify('broly', $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
今、ユーザー認証、パスワード認証を行うためにJavaを使用するには、ビジネスニーズの一部は、ここでは互換性の問題に関連しています。最初はBCryptPasswordEncoderテストの春のセキュリティを使用するには:
package com.dreamlike.dmlkdemo;
import org.junit.Test;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
/**
* @author Broly
*
*/
public class CryptTests {
@Test
public void bcryptTest() {
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
System.out.println(bCryptPasswordEncoder.encode("broly"));
// $2a$10$h.cMz2AmkBbkuUKnFY837uCB3/JZgtJUV7BBUnaGWUCrMk/FF4nX.
String encodedPassword = "$2y$10$wO./FnpCf8NkqjXbgV5ZT.juYia/Ts4Fz6ZBZgfWObmOjlAQwKtfO";
boolean bMatch = bCryptPasswordEncoder.matches("broly", encodedPassword);
System.out.println(bMatch); // false
}
}
そのテストパスを発見しました。次password_hash()のオンライン検索は、デフォルトの暗号化アルゴリズムでありますCRYPT_BLOWFISH
,官方文档有这样一段描述:
CRYPT_BLOWFISH
-フグ塩とハッシュを次のように「$ 2aは$」、「$ 2X $」または「$ 2Y $」、2桁のコストパラメータ、「$」、およびアルファベットから22文字」./0-9A- ZA-Z」。塩でこの範囲外の文字を使用すると、長さゼロの文字列を返すために)(クリプト原因になります。2桁のコストパラメータは、基礎となるフグベースハッシュalgorithmeterための反復回数の2を底とする対数であり、04から31の範囲内にある必要があり、この範囲外の値は、陰窩()が失敗します。塩プレフィックスとして5.3.7のみサポート「$ 2A $」の前にPHPのバージョン:PHP 5.3.7は、フグの実装におけるセキュリティ上の弱点を修正する新しいプレフィックスを導入しました。参照してください 、この文書を» セキュリティ修正の完全な詳細については、しかし、開発者が唯一のPHP 5.3をターゲットに、要約します。
両者の違いを見つけるには、文字列の先頭である。2A $ $と$ 2Y $。セキュリティ修正の新しいバージョンの冒頭に効果その$ 2Y $。Javaはたったの$ 2aは$をサポートしています。
実際には、解決策を判断する前に、その後、$ 2Y $ $ $ 2A、裁判官の中に置かれて、簡単です:
package com.dreamlike.dmlkdemo;
import org.junit.Test;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
/**
* @author Broly
*
*/
public class CryptTests {
@Test
public void bcryptTest() {
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
System.out.println(bCryptPasswordEncoder.encode("broly"));
// $2a$10$h.cMz2AmkBbkuUKnFY837uCB3/JZgtJUV7BBUnaGWUCrMk/FF4nX.
// String encodedPassword = "$2y$10$wO./FnpCf8NkqjXbgV5ZT.juYia/Ts4Fz6ZBZgfWObmOjlAQwKtfO";
String encodedPassword = "$2a$10$wO./FnpCf8NkqjXbgV5ZT.juYia/Ts4Fz6ZBZgfWObmOjlAQwKtfO";
boolean bMatch = bCryptPasswordEncoder.matches("broly", encodedPassword);
System.out.println(bMatch); // true
}
}
参考链接: " どのようにJavaで計算するには、A bcryptのLaravelと互換性のパスワード」
その他:https://laravel-china.org/docs/laravel/5.6/hashing/1383#4881e0