RUST实现简易随机密码生成器
·
一、项目概述
项目简介
一款超轻量的 Rust 命令行随机密码生成工具,支持自定义密码长度、字符类型(数字、字母、特殊符号),生成安全可靠的随机密码。无任何第三方依赖,仅依赖 Rust 标准库,代码简洁、编译快速,适合日常账号注册、密码重置等场景。
核心功能
- 自定义密码长度(默认 12 位)
- 可选字符类型组合:数字、小写字母、大写字母、特殊符号
- 确保生成的密码包含至少选中的每种字符类型(避免纯数字 / 纯字母)
- 支持一次生成多个密码(默认 1 个)
- 友好的命令行提示与错误处理
技术栈
- 开发语言:Rust(Edition 2021)
- 标准库模块:
<font style="background-color:rgb(187,191,196);">std::io</font>(输入输出)、<font style="background-color:rgb(187,191,196);">std::env::args</font>(命令行参数)、<font style="background-color:rgb(187,191,196);">rand</font>相关(Rust 1.58+ 内置随机数功能,无需额外依赖)
二、项目结构
rust_password_generator/
├── Cargo.toml # 项目配置
└── src/
└── main.rs # 单文件实现所有逻辑(简化结构,易上手)

三、完整代码实现(src/main.rs)
// 导入必需的 trait 和模块(解决 next_u32/next_u64 方法找不到问题)
use rand::{thread_rng, RngCore};
use std::str::FromStr;
// 字符类型配置
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
struct CharSet {
digits: bool, // 0-9
lowercase: bool, // a-z
uppercase: bool, // A-Z
symbols: bool, // 特殊符号
}
impl Default for CharSet {
fn default() -> Self {
Self { digits: true, lowercase: true, uppercase: true, symbols: false }
}
}
impl CharSet {
// 获取所有选中的字符
fn get_chars(&self) -> Vec<char> {
let mut chars = Vec::new();
if self.digits { chars.extend('0'..='9'); }
if self.lowercase { chars.extend('a'..='z'); }
if self.uppercase { chars.extend('A'..='Z'); }
if self.symbols { chars.extend("!@#$%^&*()_+-=[]{}|;:,.?~`".chars()); }
chars
}
// 检查是否有效(至少选一种字符)
fn is_valid(&self) -> bool {
self.digits || self.lowercase || self.uppercase || self.symbols
}
// 选中的字符类型数量
fn count(&self) -> usize {
let mut cnt = 0;
if self.digits { cnt += 1; }
if self.lowercase { cnt += 1; }
if self.uppercase { cnt += 1; }
if self.symbols { cnt += 1; }
cnt
}
}
// 生成随机密码(统一用 next_u64,避免类型转换问题)
fn generate_password(length: usize, char_set: CharSet) -> Result<String, String> {
let chars = char_set.get_chars();
if chars.is_empty() {
return Err("❌ 至少选中一种字符类型".to_string());
}
if length < char_set.count() {
return Err(format!("❌ 密码长度不能小于 {}", char_set.count()));
}
let mut rng = thread_rng();
let mut password = Vec::with_capacity(length);
// 1. 每种选中的字符类型至少添加一个(用 next_u64,无需 u32 转换)
// 2. 填充剩余长度
while password.len() < length {
let idx = (rng.next_u64() % chars.len() as u64) as usize;
password.push( chars[idx] );
}
// 3. Fisher-Yates 洗牌算法
for i in (1..password.len()).rev() {
let j = (rng.next_u64() % (i + 1) as u64) as usize;
password.swap(i, j);
}
Ok(password.into_iter().collect())
}
// 解析命令行参数
fn parse_args(args: &[String]) -> (usize, usize, CharSet) {
let mut len = 12;
let mut cnt = 1;
let mut char_set = CharSet::default();
let mut i = 1;
while i < args.len() {
match args[i].as_str() {
"-l" | "--length" => {
if i+1 < args.len() {
len = args[i+1].parse().unwrap_or(12).max(4);
i += 1;
}
}
"-c" | "--count" => {
if i+1 < args.len() {
cnt = args[i+1].parse().unwrap_or(1).clamp(1, 10);
i += 1;
}
}
"-d" => char_set.digits = true,
"-no-d" => char_set.digits = false,
"-L" => char_set.lowercase = true,
"-no-L" => char_set.lowercase = false,
"-U" => char_set.uppercase = true,
"-no-U" => char_set.uppercase = false,
"-s" => char_set.symbols = true,
"-no-s" => char_set.symbols = false,
"-h" | "--help" => { print_usage(); std::process::exit(0); }
_ => { eprintln!("⚠️ 未知参数:{}", args[i]); print_usage(); std::process::exit(1); }
}
i += 1;
}
(len, cnt, char_set)
}
// 帮助信息
fn print_usage() {
println!("📝 随机密码生成器 - 用法");
println!("cargo run -- [参数]");
println!(" -l <数字> 密码长度(默认12,最小4)");
println!(" -c <数字> 生成数量(默认1,1-10)");
println!(" 字符类型:-d(数字) -L(小写) -U(大写) -s(特殊符号)");
println!(" -no-d(不含数字) 等(默认:数字+小写+大写)");
println!("示例:");
println!(" 生成1个16位含特殊符号:cargo run -- -l 16 -s");
println!(" 生成3个8位仅数字+小写:cargo run -- -l 8 -c 3 -no-U -no-s");
}
// 简单颜色输出(可选)
trait Green {
fn green(&self) -> String;
}
impl Green for str {
fn green(&self) -> String {
#[cfg(not(target_os = "windows"))]
return format!("\x1B[32m{}\x1B[0m", self);
#[cfg(target_os = "windows")]
return self.to_string();
}
}
fn main() {
let args = std::env::args().collect::<Vec<_>>();
if args.len() == 1 { print_usage(); return; }
let (len, cnt, char_set) = parse_args(&args);
if !char_set.is_valid() { eprintln!("❌ 未选中任何字符类型!"); return; }
println!("\n✅ 生成 {} 个 {} 位密码(字符类型:", cnt, len);
print!(" ");
if char_set.digits { print!("数字 "); }
if char_set.lowercase { print!("小写字母 "); }
if char_set.uppercase { print!("大写字母 "); }
if char_set.symbols { print!("特殊符号 "); }
println!(")\n");
for i in 1..=cnt {
match generate_password(len, char_set) {
Ok(pwd) => println!("{}: {}", i, pwd.green()),
Err(e) => eprintln!("❌ 生成失败:{}", e),
}
}
}
四、Cargo.toml 配置
[package]name = "rust_password_generator"version = "0.1.0"edition = "2021"description = "Rust 简易随机密码生成器(无第三方依赖)"authors = ["Your Name"]# 无需任何第三方依赖,仅用标准库[dependencies]
五、使用指南
基础命令(直接运行)
bash
# 1. 显示帮助信息cargo run -- -h# 2. 生成默认密码(1 个 12 位,数字+小写+大写)cargo run
# 3. 生成 1 个 16 位密码(包含特殊符号)cargo run -- -l 16 -s# 4. 生成 3 个 8 位密码(仅数字+小写字母)cargo run -- -l 8 -c 3 -no-U -no-s
# 5. 生成 2 个 10 位密码(仅大写字母+特殊符号)cargo run -- -l 10 -c 2 -no-d -no-L -s

输出示例
✅ 生成 2 个 16 位密码(字符类型:
数字 小写字母 大写字母 特殊符号 )
1: 8Zk$p2xQ!9rW3vY7
2: 3Xj&s5mB*7qT1zR9
💡 提示:密码已随机生成,建议妥善保存,切勿明文泄露!

六、核心技术要点
- 随机数安全:使用 Rust 标准库
<font style="background-color:rgb(187,191,196);">rand::thread_rng()</font>(线程安全的随机数生成器),确保密码随机性。 - 密码安全性:强制每种选中的字符类型至少出现一次,避免生成纯数字 / 纯字母的弱密码,同时打乱密码顺序。
想了解更多关于Rust语言的知识及应用,可前往华为开放原子旋武开源社区(https://xuanwu.openatom.cn/),了解更多资讯~
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)