daoyi_cloud_common/utils/
mod.rs

1use argon2::password_hash::rand_core::OsRng;
2use argon2::{Argon2, PasswordHash, password_hash::SaltString};
3use rand::Rng;
4use rand::distr::Alphanumeric;
5use std::iter;
6
7#[allow(dead_code)]
8#[inline]
9pub fn random_string(limit: usize) -> String {
10    iter::repeat(())
11        .map(|_| rand::rng().sample(Alphanumeric))
12        .map(char::from)
13        .take(limit)
14        .collect()
15}
16
17pub fn verify_password(password: &str, password_hash: &str) -> anyhow::Result<()> {
18    let hash = PasswordHash::new(&password_hash)
19        .map_err(|e| anyhow::anyhow!("invalid password hash: {}", e))?;
20    let result = hash.verify_password(&[&Argon2::default()], password);
21    match result {
22        Ok(_) => Ok(()),
23        Err(_) => Err(anyhow::anyhow!("invalid password")),
24    }
25}
26
27pub fn hash_password(password: &str) -> anyhow::Result<String> {
28    let salt = SaltString::generate(&mut OsRng);
29    Ok(PasswordHash::generate(Argon2::default(), password, &salt)
30        .map_err(|e| anyhow::anyhow!("failed to generate password hash: {}", e))?
31        .to_string())
32}