use argon2::{ Argon2, PasswordHash, PasswordHasher, PasswordVerifier, password_hash::{SaltString, rand_core::OsRng}, }; use crate::errors::ApiError; pub fn hash(text: &str) -> Result { let salt = SaltString::generate(&mut OsRng); let argon2 = Argon2::default(); let password_hash = argon2 .hash_password(text.as_bytes(), &salt) .map_err(|e| { tracing::error!("Hash error: {}", e); ApiError::Internal })?; Ok(password_hash.to_string()) } pub fn verify(text: &str, hash: &str) -> Result { let parsed_hash = PasswordHash::new(hash) .map_err(|e| { tracing::error!("Hash parsing error: {}", e); ApiError::Internal })?; let argon2 = Argon2::default(); Ok(argon2.verify_password(text.as_bytes(), &parsed_hash).is_ok()) }