Skip to main content

karbon_framework/security/
password.rs

1use argon2::{
2    password_hash::{rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString},
3    Argon2,
4};
5
6/// Password hashing and verification using Argon2id
7/// Also supports legacy bcrypt hashes ($2y$/$2b$) from Symfony
8pub struct Password;
9
10impl Password {
11    /// Hash a password with Argon2id
12    pub fn hash(password: &str) -> Result<String, argon2::password_hash::Error> {
13        let salt = SaltString::generate(&mut OsRng);
14        let argon2 = Argon2::default();
15        let hash = argon2.hash_password(password.as_bytes(), &salt)?;
16        Ok(hash.to_string())
17    }
18
19    /// Verify a password against a hash — supports bcrypt ($2y$/$2b$) and Argon2id
20    pub fn verify(password: &str, hash: &str) -> Result<bool, argon2::password_hash::Error> {
21        if hash.starts_with("$2y$") || hash.starts_with("$2b$") {
22            Ok(bcrypt::verify(password, hash).unwrap_or(false))
23        } else {
24            let parsed_hash = PasswordHash::new(hash)?;
25            Ok(Argon2::default()
26                .verify_password(password.as_bytes(), &parsed_hash)
27                .is_ok())
28        }
29    }
30}