karbon_framework/security/
password.rs1use argon2::{
2 password_hash::{rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString},
3 Argon2,
4};
5
6pub struct Password;
9
10impl Password {
11 pub fn hash(password: &str) -> Result<String, argon2::password_hash::Error> {
13 let salt = SaltString::generate(&mut OsRng);
14 let argon2 = Argon2::default();
15 let hash = argon2.hash_password(password.as_bytes(), &salt)?;
16 Ok(hash.to_string())
17 }
18
19 pub fn verify(password: &str, hash: &str) -> Result<bool, argon2::password_hash::Error> {
21 if hash.starts_with("$2y$") || hash.starts_with("$2b$") {
22 Ok(bcrypt::verify(password, hash).unwrap_or(false))
23 } else {
24 let parsed_hash = PasswordHash::new(hash)?;
25 Ok(Argon2::default()
26 .verify_password(password.as_bytes(), &parsed_hash)
27 .is_ok())
28 }
29 }
30}