25 个稳定版本
3.1.16 | 2023年9月11日 |
---|---|
3.1.13 | 2023年4月9日 |
3.1.12 | 2022年11月3日 |
3.1.9 | 2022年3月18日 |
0.3.1 | 2018年9月7日 |
#22 in 算法
26,394 每月下载量
在 25 个 crate(22 个直接)中使用
1MB
800 行
密码
本库提供生成多个可读密码的有用工具,以及分析和评分这些密码。
生成器
PasswordGenerator
可用于生成包含可选数字、小写字母、大写字母、符号和空格的密码。
use passwords::PasswordGenerator;
let pg = PasswordGenerator {
length: 8,
numbers: true,
lowercase_letters: true,
uppercase_letters: true,
symbols: true,
spaces: true,
exclude_similar_characters: false,
strict: true,
};
println!("{}", pg.generate_one().unwrap());
println!("{:?}", pg.generate(5).unwrap());
它还提供了一个流畅的接口。
use passwords::PasswordGenerator;
let pg = PasswordGenerator::new().length(8).numbers(true).lowercase_letters(true).uppercase_letters(true).symbols(true).spaces(true).exclude_similar_characters(true).strict(true);
println!("{}", pg.generate_one().unwrap());
println!("{:?}", pg.generate(5).unwrap());
generate
方法已针对多次生成进行了优化。不要重复使用generate_one
方法来生成多个密码。如果无法确定密码的数量,请使用try_iter
方法创建一个实现Iterator
特质的PasswordGeneratorIter
实例,该实例可以更有效地重新生成密码。
use passwords::PasswordGenerator;
let pgi = PasswordGenerator::new().try_iter().unwrap();
println!("{}", pgi.generate_one());
println!("{:?}", pgi.generate(5));
use passwords::PasswordGenerator;
let mut pgi = PasswordGenerator::new().try_iter().unwrap();
println!("{}", pgi.next().unwrap());
println!("{}", pgi.next().unwrap());
哈希器
要启用哈希功能,您需要启用crypto
特性。
[dependencies.passwords]
version = "*"
features = ["crypto"]
然后,在hasher
模块中,bcrypt
、identify_bcrypt
、bcrypt_format
、identify_bcrypt_format
、get_password_with_null_terminated_byte
和gen_salt
函数可用。
use passwords::hasher;
let salt = hasher::gen_salt();
let hashed = hasher::bcrypt(10, &salt, "password\0").unwrap();
assert!(unsafe { hasher::identify_bcrypt(10, &salt, "password\0", &hashed) });
let mcf = hasher::bcrypt_format(10, &salt, "password\0").unwrap();
assert!(unsafe { hasher::identify_bcrypt_format("password\0", mcf) });
分析器
analyzer
模块中的analyze
函数可以用于创建一个包含有关输入密码的一些信息的AnalyzedPassword
实例。
通常,我们不希望我们的可读密码包含像BS、LF、CR之类的控制字符。在分析器分析密码之前,它会过滤密码以移除其控制字符。分析完成后,分析器将返回过滤后的密码。因此,您可以在将输入密码存储到数据库之前(或者通常先散列然后存储)将其用作密码保护器。
use passwords::analyzer;
let password = "ZYX[$BCkQB中文}%A_3456] H(\rg";
let analyzed = analyzer::analyze(password);
assert_eq!("ZYX[$BCkQB中文}%A_3456] H(g", analyzed.password()); // "\r" was filtered
assert_eq!(26, analyzed.length()); // Characters' length, instead of that of UTF-8 bytes
assert_eq!(2, analyzed.spaces_count()); // Two spaces between "]" and "H"
assert_eq!(4, analyzed.numbers_count()); // Numbers are "3456"
assert_eq!(2, analyzed.lowercase_letters_count()); // Lowercase letters are "k" and "g"
assert_eq!(9, analyzed.uppercase_letters_count()); // Uppercase letters are "ZYX", "BC", "QB", "A" and "H"
assert_eq!(7, analyzed.symbols_count()); // Symbols are "[$", "}%", "_", "]" and "("
assert_eq!(2, analyzed.other_characters_count()); // Other characters are "中文". These characters are usually not included on the rainbow table.
assert_eq!(2, analyzed.consecutive_count()); // Consecutive repeated characters are " " (two spaces)
assert_eq!(2, analyzed.non_consecutive_count()); // Non-consecutive repeated characters are "B" (appears twice)
assert_eq!(7, analyzed.progressive_count()); // Progressive characters are "ZYX" and "3456". "BC" is not counted, because its length is only 2, not three or more.
您还可以通过查找常用密码表来检查密码是否过于简单且危险。如果您想这样做,您需要启用common-password
特性。
[dependencies.passwords]
version = "*"
features = ["common-password"]
然后,analyzer
模块中的is_common_password
函数和AnalyzedPassword
实例的is_common
方法可用。
您应该注意,在启用 common-password 功能后,编译时间会显著增加,因为 常见密码表 将被编译成可执行二进制文件中的硬编码数组。
评分器
分析密码后,您可以使用 score
函数在 scorer
模块中对密码进行评分。
use passwords::analyzer;
use passwords::scorer;
assert_eq!(62f64, scorer::score(&analyzer::analyze("kq4zpz13")));
assert_eq!(100f64, scorer::score(&analyzer::analyze("ZYX[$BCkQB中文}%A_3456] H(\rg")));
if cfg!(feature = "common-password") {
assert_eq!(11.2f64, scorer::score(&analyzer::analyze("feelings"))); // "feelings" is common, so the score is punitively the original divided by 5
} else {
assert_eq!(56f64, scorer::score(&analyzer::analyze("feelings")));
}
评分在以下范围内的密码:
- 0 ~ 20 非常危险(可能几秒钟内被破解)
- 20 ~ 40 危险
- 40 ~ 60 非常弱
- 60 ~ 80 弱
- 80 ~ 90 良好
- 90 ~ 95 强
- 95 ~ 99 非常强
- 99 ~ 100 无敌
Crates.io
https://crates.io/crates/passwords