main.rs gelöscht
This commit is contained in:
parent
3db77df5cd
commit
cd80522952
1 changed files with 0 additions and 136 deletions
136
main.rs
136
main.rs
|
@ -1,136 +0,0 @@
|
||||||
use argon2::{password_hash::SaltString, Algorithm, Argon2, Params, PasswordHasher, Version};
|
|
||||||
use colored::Colorize;
|
|
||||||
use passwords::{analyzer, scorer, PasswordGenerator};
|
|
||||||
use rand_core::OsRng;
|
|
||||||
use rayon::prelude::*;
|
|
||||||
use zeroize::Zeroize;
|
|
||||||
|
|
||||||
mod errors;
|
|
||||||
use errors::{ArgonError, MyError};
|
|
||||||
|
|
||||||
// Configuration Constants
|
|
||||||
const MEMORY_COST: u32 = 50;
|
|
||||||
const TIME_COST: u32 = 2;
|
|
||||||
const PARALLELISM: u32 = 2;
|
|
||||||
const OUTPUT_LEN: usize = 32;
|
|
||||||
const NUMBER_OF_PASSWORDS: u32 = 50;
|
|
||||||
|
|
||||||
type PasswordWithScore = (String, f64);
|
|
||||||
|
|
||||||
fn main() -> Result<(), MyError> {
|
|
||||||
let argon2 = create_argon2();
|
|
||||||
|
|
||||||
// Generate and hash passwords in parallel
|
|
||||||
let results: Result<Vec<_>, _> = (0..NUMBER_OF_PASSWORDS)
|
|
||||||
.into_par_iter()
|
|
||||||
.map(|_| {
|
|
||||||
let password_gen = create_password_generator();
|
|
||||||
let (mut password, _) = generate_password(&password_gen)?;
|
|
||||||
let salt = SaltString::generate(&mut OsRng);
|
|
||||||
let hash_result = hash_password(&argon2, &password, &salt);
|
|
||||||
password.zeroize(); // Zeroize the password to prevent memory-based attacks
|
|
||||||
hash_result
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
match results {
|
|
||||||
Ok(hashes) => {
|
|
||||||
hashes
|
|
||||||
.into_par_iter()
|
|
||||||
.for_each(|hash| println!("Hash output: {}", hash));
|
|
||||||
println!(
|
|
||||||
"{}",
|
|
||||||
"[LOG] All passwords have been hashed successfully".green()
|
|
||||||
);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
Err(e) => Err(e),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn create_argon2() -> Argon2<'static> {
|
|
||||||
let params = Params::new(MEMORY_COST, TIME_COST, PARALLELISM, Some(OUTPUT_LEN))
|
|
||||||
.expect("Failed to set Argon2 parameters");
|
|
||||||
Argon2::new(Algorithm::Argon2id, Version::V0x13, params)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn hash_password(
|
|
||||||
argon2: &Argon2<'_>,
|
|
||||||
password: &str,
|
|
||||||
salt: &SaltString,
|
|
||||||
) -> Result<String, MyError> {
|
|
||||||
argon2
|
|
||||||
.hash_password(password.as_bytes(), salt)
|
|
||||||
.map_err(|source| MyError::HashingError {
|
|
||||||
source: ArgonError::from(errors::ArgonError(source)),
|
|
||||||
salt: salt.clone(),
|
|
||||||
})
|
|
||||||
.map(|hash| hash.to_string())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn create_password_generator() -> PasswordGenerator {
|
|
||||||
PasswordGenerator {
|
|
||||||
length: 16,
|
|
||||||
numbers: true,
|
|
||||||
lowercase_letters: true,
|
|
||||||
uppercase_letters: true,
|
|
||||||
symbols: true,
|
|
||||||
spaces: false,
|
|
||||||
exclude_similar_characters: true,
|
|
||||||
strict: true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn generate_password(password_gen: &PasswordGenerator) -> Result<PasswordWithScore, MyError> {
|
|
||||||
let password = password_gen
|
|
||||||
.generate_one()
|
|
||||||
.map_err(|_| MyError::PasswordGenerationError)?;
|
|
||||||
let analyzed = analyzer::analyze(&password);
|
|
||||||
let score = scorer::score(&analyzed);
|
|
||||||
Ok((password, score))
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::*;
|
|
||||||
use lazy_static::lazy_static;
|
|
||||||
|
|
||||||
lazy_static! {
|
|
||||||
static ref PASSWORDGENERATOR: PasswordGenerator = PasswordGenerator {
|
|
||||||
length: 16,
|
|
||||||
numbers: true,
|
|
||||||
lowercase_letters: true,
|
|
||||||
uppercase_letters: true,
|
|
||||||
symbols: true,
|
|
||||||
spaces: false,
|
|
||||||
exclude_similar_characters: true,
|
|
||||||
strict: true,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_generate_password() {
|
|
||||||
match generate_password(&PASSWORDGENERATOR) {
|
|
||||||
Ok((password, _score)) => {
|
|
||||||
assert!(password.len() == 16 && password.chars().all(|c| c.is_ascii_graphic()));
|
|
||||||
}
|
|
||||||
Err(e) => {
|
|
||||||
panic!("Password generation failed with error: {}", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_hash_password() {
|
|
||||||
let (mut password, _score) = match generate_password(&PASSWORDGENERATOR) {
|
|
||||||
Ok(result) => result,
|
|
||||||
Err(e) => panic!("Password generation failed with error: {}", e),
|
|
||||||
};
|
|
||||||
|
|
||||||
let argon2 = create_argon2();
|
|
||||||
let salt = SaltString::generate(&mut OsRng);
|
|
||||||
let result = argon2.hash_password(&password.as_bytes(), &salt);
|
|
||||||
assert!(result.is_ok());
|
|
||||||
password.zeroize();
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue