diff --git a/crypto/src/main/java/org/springframework/security/crypto/bcrypt/BCrypt.java b/crypto/src/main/java/org/springframework/security/crypto/bcrypt/BCrypt.java index 0f8d082fdf..172928401e 100644 --- a/crypto/src/main/java/org/springframework/security/crypto/bcrypt/BCrypt.java +++ b/crypto/src/main/java/org/springframework/security/crypto/bcrypt/BCrypt.java @@ -611,6 +611,9 @@ public class BCrypt { int rounds, off; StringBuilder rs = new StringBuilder(); + if (passwordb.length > 72) { + throw new IllegalArgumentException("password cannot be more than 72 bytes"); + } if (salt == null) { throw new IllegalArgumentException("salt cannot be null"); } diff --git a/crypto/src/test/java/org/springframework/security/crypto/bcrypt/BCryptPasswordEncoderTests.java b/crypto/src/test/java/org/springframework/security/crypto/bcrypt/BCryptPasswordEncoderTests.java index b3780847d9..df14ebe906 100644 --- a/crypto/src/test/java/org/springframework/security/crypto/bcrypt/BCryptPasswordEncoderTests.java +++ b/crypto/src/test/java/org/springframework/security/crypto/bcrypt/BCryptPasswordEncoderTests.java @@ -222,4 +222,14 @@ public class BCryptPasswordEncoderTests { assertThat(encoder.matches("wrong", "$2a$00$9N8N35BVs5TLqGL3pspAte5OWWA2a2aZIs.EGp7At7txYakFERMue")).isFalse(); } + @Test + public void enforcePasswordLength() { + BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); + String password72chars = "123456789012345678901234567890123456789012345678901234567890123456789012"; + assertThat(encoder.matches(password72chars, encoder.encode(password72chars))).isTrue(); + String password73chars = password72chars.concat("a"); + assertThatIllegalArgumentException() + .isThrownBy(() -> encoder.matches(password73chars, encoder.encode(password73chars))); + } + }