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}