パスワードハッシュ関数Bcryptの最大パスワード長さ制限の詳細


パスワードハッシュ関数Bcryptの最大パスワード長さ制限
Bcryptは人気のあるパスワード・ハッシュ・アルゴリズムであり、Niels ProvosとDavidMazersがBlowfish暗号化アルゴリズムに基づいて設計したパスワード・ハッシュアルゴリズムであり、1999年にUSENIX協会に提出した。Bcryptは、塩Saltを設計に含めて、レインボーウオッチ攻撃を防ぐ適応機能を提供しています。時間が経つにつれて、計算能力を増加させた場合でも、Bcryptは暴力攻撃に抵抗することができます。
BcryptはOpenBSDやSUSE Linuxなどのオペレーティングシステムのデフォルトのパスワード・ハッシュアルゴリズムである。しかし、Bcryptアルゴリズムを使うと、最大のパスワード長さ制限があり、通常は50~72文字で、正確な長さ制限は具体的なBcryptの実現に依存します。最大長さを超えるパスワードは切断されます。
次にspring Securityを使用するBryptPassword Encerderを例に挙げます。

BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
// 72   
String password1 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
// 73   
String password2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab";
String encodedPassword1 = passwordEncoder.encode(password1);
boolean matches = passwordEncoder.matches(password2, encodedPassword1);
System.out.println("encodedPassword1: " + encodedPassword1);
System.out.println("matches: " + matches);
プログラムを実行すると、このような結果が出力されます。

encodedPassword1: $2a$10$A5OpVKgjEZzmy6UNsqzkjuG2xGET1wp3b/9ET5dz/tHQ3eRvyXSSO
matches: true
これは、Password文字列が72文字以上の部分を切断して廃棄されたことを証明している。
Bcryptパスワードアルゴリズム72文字の長さ制限の問題を解決するには、このようにしても良いです。
まずSHA-256アルゴリズムを使って文字列を暗号化し、Bcryptアルゴリズムを使って暗号化し、疑似コードで次のように示します。

hashpw(sha256('password'), salt);
読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。