04b5623417476787e1eb4a97a37b72d012266667
1 use std
::string
::String
;
4 password_hash
::{rand_core
::OsRng
, PasswordHash
, PasswordHasher
, PasswordVerifier
, SaltString
},
8 pub fn hash(password
: &str) -> Result
<String
, Box
<dyn std
::error
::Error
>> {
9 let salt
= SaltString
::generate(&mut OsRng
);
10 let argon2
= Argon2
::default();
12 .hash_password(password
.as_bytes(), &salt
)
13 .map(|h
| h
.to_string())
14 .map_err(|e
| e
.into())
17 pub fn verify_password(
19 hashed_password
: &str,
20 ) -> Result
<bool
, Box
<dyn std
::error
::Error
>> {
21 let argon2
= Argon2
::default();
22 let parsed_hash
= PasswordHash
::new(hashed_password
)?
;
24 .verify_password(password
.as_bytes(), &parsed_hash
)
33 fn simple_case() -> Result
<(), Box
<dyn std
::error
::Error
>> {
34 let password
= "12345";
35 let hash
= hash(password
)?
;
36 println!("hash: {}", &hash
);
37 assert!(verify_password(password
, &hash
)?
);
38 assert!(!verify_password("54321", &hash
)?
);
43 fn password_with_special_characters() -> Result
<(), Box
<dyn std
::error
::Error
>> {
44 let password
= "éà ä_\\😺🎮🇨🇭";
45 let hash
= hash(password
)?
;
46 println!("hash: {}", &hash
);
47 assert!(verify_password(password
, &hash
)?
);