use argon2::{
password_hash::{self, rand_core::OsRng, PasswordVerifier, SaltString},
Argon2, PasswordHash, PasswordHasher,
};
pub fn hash_password(password: &str) -> password_hash::Result<String> {
let salt = SaltString::generate(&mut OsRng);
let argon2 = Argon2::default();
let password_hash = argon2.hash_password(password.as_bytes(), &salt)?;
let value = format!("{}", password_hash);
Ok(value)
}
pub fn verify_password(password: &str, hash: &str) -> bool {
let hash = match PasswordHash::new(hash) {
Ok(value) => value,
_ => return false,
};
let argon2 = Argon2::default();
argon2.verify_password(password.as_bytes(), &hash).is_ok()
}
#[cfg(test)]
mod test {
use crate::utils::random::generate_random_string;
use super::{hash_password, verify_password};
#[test]
fn test_password_hashing() {
let value = generate_random_string(50);
let hash = hash_password(&value).unwrap();
let valid = verify_password(&value, &hash);
assert_eq!(valid, true)
}
}