diff --git a/src/utils/mod.rs b/src/utils/mod.rs index d949670..25d5f55 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -1 +1,2 @@ +pub mod pass_utils; pub mod str_utils; diff --git a/src/utils/pass_utils.rs b/src/utils/pass_utils.rs new file mode 100644 index 0000000..7738cab --- /dev/null +++ b/src/utils/pass_utils.rs @@ -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() +}