Skip to main content

shared_framework/utils/
crypto.rs

1//! Password hashing and token generation.
2//!
3//! [`CryptoHelper`] hashes passwords with Argon2, verifies hashes, and creates
4//! random alphanumeric tokens. Use it for storing credentials and issuing opaque tokens.
5//!
6//! ```ignore
7//! let hash = CryptoHelper::hash_password("secret")?;
8//! assert!(CryptoHelper::verify_password(&hash, "secret")?);
9//! ```
10
11use argon2::{Argon2, PasswordHash, PasswordHasher, PasswordVerifier};
12
13/// Password hashing (Argon2) and random token helpers.
14pub struct CryptoHelper;
15
16impl CryptoHelper {
17    /// Hashes a password with Argon2. Returns an error if hashing fails.
18    pub fn hash_password(password: &str) -> Result<String, argon2::password_hash::Error> {
19        let argon2 = Argon2::default();
20        Ok(argon2.hash_password(password.as_bytes())?.to_string())
21    }
22
23    /// Verifies a password against an Argon2 hash. Returns `Ok(false)` for a mismatch
24    /// and an error when the stored hash cannot be parsed.
25    pub fn verify_password(hash: &str, password: &str) -> Result<bool, argon2::password_hash::Error> {
26        let parsed = PasswordHash::new(hash)?;
27        Ok(Argon2::default().verify_password(password.as_bytes(), &parsed).is_ok())
28    }
29
30    /// Creates a random alphanumeric token of length `len`.
31    pub fn random_token(len: usize) -> String {
32        crate::utils::data_helpers::DataHelpers::create_token(len)
33    }
34}