Rust密码管理库passt的使用,安全高效的密码存储与验证解决方案
Rust密码管理库passt的使用,安全高效的密码存储与验证解决方案
passt
是一个"零依赖"的随机字符串生成器,可用于在终端或应用程序中生成密码。
零依赖?
passt
仅依赖Rust标准库,具体包括:
std::fs::File
std::io::Read
以及CLI部分额外依赖:std::env
std::process::exit
唯一的其他"依赖"是从/dev/urandom
读取随机整数来生成随机值。
支持的操作系统
*nix系统
所有GNU/Linux/*nix系统都支持,只要它们有/dev/urandom
。已在MacOS和Ubuntu上测试。
Windows支持
Windows会读取file:/dev/urandom
但尚未测试。
库使用方式
使用标准字符集
可能的字符包括:
a-zA-Z0-9
(如果不包含特殊字符)a-zA-Z0-9
和!§$%&/()=?´-_.,:;#'+*<>°^
(如果包含特殊字符)
use passt::Passt;
fn my_random_password() -> String {
// Passt::random_password(length: i32, with_special_chars: Option<bool>) -> String {
Passt::random_password(16, Some(false));
}
fn my_random_password_with_none() -> String {
Passt::random_password(16, None);
}
fn my_random_password_with_special_chars() -> String {
Passt::random_password(16, Some(true));
}
指定自定义字符集
这允许你使用不同的可能字符集。
fn my_custom_set() {
// 仅从随机字符"acefhjlnprtvxz13579"创建密码
Pass::random_password_with_custom_set(16, "acefhjlnprtvxz13579")
}
CLI使用方式
安装
使用cargo
安装:
cargo install passt
然后如下使用:
USAGE: passt -l <int> [-s] [-chars "<str>"] [-n <int>]
-l 生成密码的长度
-n 要创建的密码数量(默认:1)
-s 使用特殊字符
-chars 可能的字符作为字符串,例如"abc012"
不包含特殊字符
$ passt -l 32
OgHFnTrSH5liCPhkrfbHdfhSWFwGGAPA
包含特殊字符
$ passt -l 16 -s
D#§2§RgI0Ou°F#
自定义字符集 甚至可以使用表情符号!
$ passt -l 16 -chars "🛹🥗🌈🦔🕶🤳🎮"
🌈🎮🎮🎮🤳🥗🎮🌈🎮🎮🎮🎮🤳🎮🕶🕶
$ passt -l 4 -chars "1234"
1341
创建多个密码
$ passt -l 4 -n 12
Bw9a
I0CP
obhV
wpmT
0tMu
h2NG
AzGd
D3jb
FmrT
mlsX
UdiJ
NbAr
限制
由于字符的随机提取较弱,最好在字符集中有重复字符。
为什么命名为"passt"
“passt"是一个德语单词,你可以说如果某件事"okay”。因为这个工具在生成可用于密码的随机字符串方面"okay",所以我觉得这个名字很合适。
许可证
passt
主要根据MIT许可证和Apache许可证(版本2.0)的条款分发。
完整示例代码
use passt::Passt;
fn main() {
// 生成16位不含特殊字符的密码
let password1 = Passt::random_password(16, Some(false));
println!("Password without special chars: {}", password1);
// 生成16位含特殊字符的密码
let password2 = Passt::random_password(16, Some(true));
println!("Password with special chars: {}", password2);
// 生成16位密码(默认不含特殊字符)
let password3 = Passt::random_password(16, None);
println!("Default password: {}", password3);
// 使用自定义字符集生成密码
let custom_chars = "ABCDEF123456!@#$%";
let password4 = Passt::random_password_with_custom_set(16, custom_chars);
println!("Custom charset password: {}", password4);
// 生成多个密码
for i in 0..5 {
let pwd = Passt::random_password(8, Some(true));
println!("Password {}: {}", i+1, pwd);
}
}
1 回复
Rust密码管理库passt的使用:安全高效的密码存储与验证解决方案
介绍
passt
是一个Rust实现的密码管理库,专注于提供安全可靠的密码存储和验证功能。它使用现代密码学算法来处理密码,主要特点包括:
- 使用Argon2id作为默认的密码哈希算法(抗GPU/ASIC攻击)
- 提供简单易用的API
- 防止时序攻击
- 自动生成和管理的盐值
- 符合OWASP密码存储推荐标准
安装
在Cargo.toml中添加依赖:
[dependencies]
passt = "0.3"
基本使用方法
密码哈希
use passt::PasswordHasher;
use passt::argon2::Argon2;
let password = "my_secure_password";
let hasher = Argon2::default();
let password_hash = hasher.hash_password(password).unwrap();
println!("Hashed password: {}", password_hash);
密码验证
use passt::PasswordVerifier;
let stored_hash = "$argon2id$v=19$m=65536,t=3,p=4$c29tZXNhbHQ$RdescudvJCsgt3ub+b+dWRWJTmaaJObG";
let input_password = "my_secure_password";
let is_valid = Argon2::default()
.verify_password(input_password, &stored_hash)
.is_ok();
println!("Password is valid: {}", is_valid);
高级配置
自定义Argon2参数
use passt::argon2::{Argon2, Params};
let params = Params::new(
65536, // 内存消耗(KB)
3, // 迭代次数
4, // 并行度
None // 输出长度(默认32字节)
).unwrap();
let hasher = Argon2::new(Default::default(), params);
let password_hash = hasher.hash_password("password").unwrap();
使用不同的哈希算法
虽然Argon2是默认推荐,passt也支持其他算法:
use passt::bcrypt::Bcrypt;
let hasher = Bcrypt::default();
let password_hash = hasher.hash_password("password", None).unwrap();
最佳实践
- 密码强度检查:在哈希前检查密码强度
fn is_password_strong(password: &str) -> bool {
password.len() >= 8 &&
password.chars().any(|c| c.is_ascii_uppercase()) &&
password.chars().any(|c| c.is_ascii_lowercase()) &&
password.chars().any(|c| c.is_ascii_digit())
}
- 定期更新哈希参数:随着硬件发展,应增加计算成本参数
- 错误处理:妥善处理可能的错误
match hasher.hash_password(password) {
Ok(hash) => { /* 存储哈希 */ },
Err(e) => eprintln!("Hashing failed: {}", e),
}
完整示例
use passt::{
PasswordHasher, PasswordVerifier,
argon2::{Argon2, Params}
};
fn main() {
// 创建自定义参数的hasher
let params = Params::new(65536, 3, 4, None).unwrap();
let hasher = Argon2::new(Default::default(), params);
// 用户注册 - 哈希密码
let password = "SecurePass123!";
let hash = hasher.hash_password(password).unwrap();
// 模拟存储到数据库
let stored_hash = hash.to_string();
// 用户登录 - 验证密码
let input_password = "SecurePass123!";
let is_valid = hasher.verify_password(input_password, &stored_hash).is_ok();
println!("Password match: {}", is_valid);
// 错误密码测试
let wrong_password = "wrong_pass";
let is_valid = hasher.verify_password(wrong_password, &stored_hash).is_ok();
println!("Wrong password match: {}", is_valid);
}
安全注意事项
- 永远不要存储明文密码
- 每个用户密码应使用唯一的盐值(passt自动处理)
- 根据硬件性能调整Argon2参数,使哈希计算时间在500ms左右
- 考虑使用pepper(应用级的秘密盐)增加安全性
- 定期更新安全参数以应对硬件发展
passt库为Rust开发者提供了符合现代安全标准的密码管理解决方案,通过合理配置可以有效地保护用户密码安全。