#password #password-generator #bcrypt #score #generate #strength

passwords

本库提供生成多个可读密码的有用工具,以及分析和评分这些密码。

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 算法

Download history 6202/week @ 2024-04-22 4844/week @ 2024-04-29 6693/week @ 2024-05-06 6519/week @ 2024-05-13 6376/week @ 2024-05-20 6256/week @ 2024-05-27 6636/week @ 2024-06-03 5960/week @ 2024-06-10 6012/week @ 2024-06-17 6762/week @ 2024-06-24 7046/week @ 2024-07-01 8932/week @ 2024-07-08 6088/week @ 2024-07-15 6958/week @ 2024-07-22 6900/week @ 2024-07-29 6058/week @ 2024-08-05

26,394 每月下载量
25 个 crate(22 个直接)中使用

MIT 许可证

1MB
800

密码

CI

本库提供生成多个可读密码的有用工具,以及分析和评分这些密码。

生成器

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模块中,bcryptidentify_bcryptbcrypt_formatidentify_bcrypt_formatget_password_with_null_terminated_bytegen_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

文档

https://docs.rs/passwords

许可证

MIT

依赖项