From 177e482783cf72d7629b3a4bdae2989770bbe0c5 Mon Sep 17 00:00:00 2001 From: Josh Cummings <3627351+jzheaux@users.noreply.github.com> Date: Thu, 2 Jul 2026 17:16:12 -0600 Subject: [PATCH] Use Constant-Time Comparison This commit updates password encoders to use a constant-time comparison method to defend against timing attacks Signed-off-by: Josh Cummings <3627351+jzheaux@users.noreply.github.com> --- .../password4j/BalloonHashingPassword4jPasswordEncoder.java | 3 ++- .../crypto/password4j/Pbkdf2Password4jPasswordEncoder.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/crypto/src/main/java/org/springframework/security/crypto/password4j/BalloonHashingPassword4jPasswordEncoder.java b/crypto/src/main/java/org/springframework/security/crypto/password4j/BalloonHashingPassword4jPasswordEncoder.java index 54735f19b2..8fa55069ba 100644 --- a/crypto/src/main/java/org/springframework/security/crypto/password4j/BalloonHashingPassword4jPasswordEncoder.java +++ b/crypto/src/main/java/org/springframework/security/crypto/password4j/BalloonHashingPassword4jPasswordEncoder.java @@ -24,6 +24,7 @@ import com.password4j.BalloonHashingFunction; import com.password4j.Hash; import com.password4j.Password; +import org.springframework.security.crypto.codec.Utf8; import org.springframework.security.crypto.password.AbstractValidatingPasswordEncoder; import org.springframework.util.Assert; @@ -140,7 +141,7 @@ public class BalloonHashingPassword4jPasswordEncoder extends AbstractValidatingP String expectedHash = parts[1]; Hash hash = Password.hash(rawPassword).addSalt(salt).with(this.balloonHashingFunction); - return expectedHash.equals(hash.getResult()); + return Utf8.isEqual(expectedHash, hash.getResult()); } catch (IllegalArgumentException ex) { // Invalid Base64 encoding diff --git a/crypto/src/main/java/org/springframework/security/crypto/password4j/Pbkdf2Password4jPasswordEncoder.java b/crypto/src/main/java/org/springframework/security/crypto/password4j/Pbkdf2Password4jPasswordEncoder.java index 65fbaa98e9..37efbb27c4 100644 --- a/crypto/src/main/java/org/springframework/security/crypto/password4j/Pbkdf2Password4jPasswordEncoder.java +++ b/crypto/src/main/java/org/springframework/security/crypto/password4j/Pbkdf2Password4jPasswordEncoder.java @@ -24,6 +24,7 @@ import com.password4j.Hash; import com.password4j.PBKDF2Function; import com.password4j.Password; +import org.springframework.security.crypto.codec.Utf8; import org.springframework.security.crypto.password.AbstractValidatingPasswordEncoder; import org.springframework.util.Assert; @@ -138,7 +139,7 @@ public class Pbkdf2Password4jPasswordEncoder extends AbstractValidatingPasswordE String expectedHash = parts[1]; Hash hash = Password.hash(rawPassword).addSalt(salt).with(this.pbkdf2Function); - return expectedHash.equals(hash.getResult()); + return Utf8.isEqual(expectedHash, hash.getResult()); } catch (IllegalArgumentException ex) { // Invalid Base64 encoding