use anyhow::Result; use pbkdf2::{ password_hash::{rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString}, Pbkdf2, }; pub struct PasswordService; impl PasswordService { pub fn hash_password(password: &str) -> Result { let salt = SaltString::generate(&mut OsRng); let password_hash = Pbkdf2 .hash_password(password.as_bytes(), &salt) .map_err(|e| anyhow::anyhow!("Failed to hash password: {}", e))?; Ok(password_hash.to_string()) } pub fn verify_password(password: &str, hash: &str) -> Result { let parsed_hash = PasswordHash::new(hash) .map_err(|e| anyhow::anyhow!("Failed to parse password hash: {}", e))?; Pbkdf2 .verify_password(password.as_bytes(), &parsed_hash) .map(|_| true) .map_err(|e| anyhow::anyhow!("Password verification failed: {}", e)) } } /// Convenience function to verify a password pub fn verify_password(password: &str, hash: &str) -> Result { PasswordService::verify_password(password, hash) }