actix_jwt_session/
hashing.rs

1//! Encrypting and decrypting password
2//!
3//! This module is available by default or by enabling `hashing` feature.
4//! Library docs covers using it in context of `register` and `sign in`.
5
6use argon2::password_hash::rand_core::OsRng;
7use argon2::password_hash::{PasswordHash, PasswordHasher, PasswordVerifier, SaltString};
8use argon2::Argon2;
9
10/// Encrypting and decrypting password
11pub struct Hashing;
12
13impl Hashing {
14    /// Takes password and returns encrypted hash with random salt
15    pub fn encrypt(password: &str) -> argon2::password_hash::Result<String> {
16        let salt = SaltString::generate(&mut OsRng);
17        let argon2 = Argon2::default();
18        argon2
19            .hash_password(password.as_bytes(), &salt)
20            .map(|hash| hash.to_string())
21    }
22
23    /// Takes password hash and password and validates it.
24    pub fn verify(password_hash: &str, password: &str) -> argon2::password_hash::Result<()> {
25        let parsed_hash = PasswordHash::new(password_hash)?;
26        Argon2::default().verify_password(password.as_bytes(), &parsed_hash)
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33
34    #[test]
35    fn check_always_random_salt() {
36        let pass = "ahs9dya8tsd7fa8tsa86tT&^R%^DS^%ARS&A";
37        let hash = Hashing::encrypt(pass).unwrap();
38        assert!(Hashing::verify(hash.as_str(), pass).is_ok());
39    }
40}