add some method for argon2 password hash

This commit is contained in:
zhl 2023-05-06 14:27:20 +08:00
parent bcbba724f7
commit 5109226cda
2 changed files with 37 additions and 0 deletions

View File

@ -1 +1,2 @@
pub mod pass_utils;
pub mod str_utils;

36
src/utils/pass_utils.rs Normal file
View File

@ -0,0 +1,36 @@
use argon2::{
password_hash::{rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString},
Argon2,
};
use base64::{engine::general_purpose, Engine as _};
use std::str;
pub fn hash_password(pass: &str) -> String {
let salt: SaltString = SaltString::generate(&mut OsRng);
let password = pass.as_bytes();
let password_hash: String = match Argon2::default().hash_password(password, &salt) {
Ok(v) => v.to_string(),
Err(e) => panic!("error hash password: {}", e),
};
general_purpose::STANDARD_NO_PAD.encode(&password_hash)
}
pub fn verify_password(pass: &str, password_hash: &str) -> bool {
let str_tmp = match general_purpose::STANDARD_NO_PAD.decode(password_hash) {
Ok(v) => v,
Err(e) => panic!("error decode base64 str: {}", e),
};
let s = match str::from_utf8(&str_tmp) {
Ok(v) => v,
Err(e) => panic!("Invalid UTF-8 sequence: {}", e),
};
let parsed_hash = match PasswordHash::new(&s) {
Ok(v) => v,
Err(e) => panic!("error parse password hash: {}", e),
};
let password = pass.as_bytes();
Argon2::default()
.verify_password(password, &parsed_hash)
.is_ok()
}