Rust密码管理库passt的使用,安全高效的密码存储与验证解决方案

Rust密码管理库passt的使用,安全高效的密码存储与验证解决方案

Passt logo

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();

最佳实践

  1. 密码强度检查:在哈希前检查密码强度
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())
}
  1. 定期更新哈希参数:随着硬件发展,应增加计算成本参数
  2. 错误处理:妥善处理可能的错误
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);
}

安全注意事项

  1. 永远不要存储明文密码
  2. 每个用户密码应使用唯一的盐值(passt自动处理)
  3. 根据硬件性能调整Argon2参数,使哈希计算时间在500ms左右
  4. 考虑使用pepper(应用级的秘密盐)增加安全性
  5. 定期更新安全参数以应对硬件发展

passt库为Rust开发者提供了符合现代安全标准的密码管理解决方案,通过合理配置可以有效地保护用户密码安全。

回到顶部