hash_password.rs 53 lignes · 1511 octets
//! Utility to hash passwords using bcrypt
//!
//! This tool generates bcrypt hashes for passwords, useful for:
//! - Manual database operations
//! - Password reset scripts
//! - Testing and development
//!
//! Usage:
//!   cargo run --bin hash_password -- "MyPassword123"
//!   cargo run --bin hash_password -- "MyPassword123" 12

use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();

    if args.len() < 2 {
        eprintln!("Usage: {} <password> [cost]", args[0]);
        eprintln!();
        eprintln!("Arguments:");
        eprintln!("  <password>  The password to hash");
        eprintln!("  [cost]      BCrypt cost (default: 12, recommended: 10-14)");
        eprintln!();
        eprintln!("Examples:");
        eprintln!("  {} 'MyPassword123'", args[0]);
        eprintln!("  {} 'MyPassword123' 12", args[0]);
        std::process::exit(1);
    }

    let password = &args[1];
    let cost = if args.len() >= 3 {
        args[2].parse::<u32>().unwrap_or(12)
    } else {
        12
    };

    // Validate cost (bcrypt accepts 4-31, but 10-14 is recommended)
    if !(4..=31).contains(&cost) {
        eprintln!("Error: Cost must be between 4 and 31 (recommended: 10-14)");
        std::process::exit(1);
    }

    // Hash the password
    match bcrypt::hash(password, cost) {
        Ok(hash) => {
            println!("{}", hash);
        }
        Err(e) => {
            eprintln!("Error hashing password: {}", e);
            std::process::exit(1);
        }
    }
}