30 lines
871 B
Rust
30 lines
871 B
Rust
|
use argon2::{
|
||
|
password_hash::{rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString},
|
||
|
Argon2,
|
||
|
};
|
||
|
|
||
|
pub fn encrypt(password: &str) -> argon2::password_hash::Result<String> {
|
||
|
let salt = SaltString::generate(&mut OsRng);
|
||
|
let argon2 = Argon2::default();
|
||
|
argon2
|
||
|
.hash_password(password.as_bytes(), &salt)
|
||
|
.map(|hash| hash.to_string())
|
||
|
}
|
||
|
|
||
|
pub fn verify(password_hash: &str, password: &str) -> argon2::password_hash::Result<()> {
|
||
|
let parsed_hash = PasswordHash::new(&password_hash)?;
|
||
|
Argon2::default().verify_password(password.as_bytes(), &parsed_hash)
|
||
|
}
|
||
|
|
||
|
#[cfg(test)]
|
||
|
mod tests {
|
||
|
use super::*;
|
||
|
|
||
|
#[test]
|
||
|
fn check_always_random_salt() {
|
||
|
let pass = "ahs9dya8tsd7fa8tsa86tT&^R%^DS^%ARS&A";
|
||
|
let hash = encrypt(pass).unwrap();
|
||
|
assert!(verify(hash.as_str(), pass).is_ok());
|
||
|
}
|
||
|
}
|