password_hash: reject an empty PBKDF2 hash/salt — a stored 'pbkdf2:iters:salt:' (empty hash) made ct_eq(&[],&[]) return true, verifying ANY password; refuse empty want/salt before computing

This commit is contained in:
Jean Chevronnet 2026-08-19 04:45:07 +00:00
parent 6bc299f286
commit 1a5c41871c

View file

@ -94,6 +94,9 @@ pub fn verify(stored: &str, plaintext: &str) -> bool {
if !(1..=MAX_PBKDF2_ITERS).contains(&iters) { if !(1..=MAX_PBKDF2_ITERS).contains(&iters) {
return false; // absurd/zero work factor — refuse, don't compute return false; // absurd/zero work factor — refuse, don't compute
} }
if want.is_empty() || salt.is_empty() {
return false; // an empty hash/salt would make ct_eq(&[],&[]) accept any password
}
if let Some(got) = pbkdf2(plaintext, &salt, iters, want.len()) { if let Some(got) = pbkdf2(plaintext, &salt, iters, want.len()) {
return ct_eq(&got, &want); return ct_eq(&got, &want);
} }