actix_jwt_session/
hashing.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//! Encrypting and decrypting password
//!
//! This module is available by default or by enabling `hashing` feature.
//! Library docs covers using it in context of `register` and `sign in`.

use argon2::password_hash::rand_core::OsRng;
use argon2::password_hash::{PasswordHash, PasswordHasher, PasswordVerifier, SaltString};
use argon2::Argon2;

/// Encrypting and decrypting password
pub struct Hashing;

impl Hashing {
    /// Takes password and returns encrypted hash with random salt
    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())
    }

    /// Takes password hash and password and validates it.
    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 = Hashing::encrypt(pass).unwrap();
        assert!(Hashing::verify(hash.as_str(), pass).is_ok());
    }
}