口令(password)
计算机、互联网中为了保护系统安全、认证用户身份,经常使用账号/密码(准确来说应该为“口令”)对用户进行访问控制;因此口令在计算机互联网中扮演非常重要的作用。如何保护口令的安全呢?
如何保护你的口令
口令如此重要,如何保护好自己的口令呢?首先口令本身应该足够复杂,足够抵御攻击,诸如:123456,12345678,abc123,888888此类的常用、但极易被破译的密码(即弱密码)不是好的选择,反着口令足够长(至少要8位以上),并且包含大小写字母、数字、特殊符号则具有更高的强度(即强密码)。其次要使用合适的加密算法对口令进行加密。例如PBKDF2、bcrypt、scrypt、Argon2等加密算法都是不错的选择,相反使用明文存储、或者使用简单的哈希算法例如MD5、SM3、SHA256等并不能很好的抵御字典攻击等破解方法。最后对密码进行定期修改,避免不同账号使用相同密码,同样十分重要。
密码强度
前面我们提到密码有强弱之分,那么该如何量化评估一个密码的强度呢?可以参考这篇博客《如何使用Rust编程语言来产生密码或是计算密码强度?密码又该如何安全保存呢?》。
use passwords::{analyzer, scorer};
let pwd = "ARG2on&@!略";
println!("score:{}", scorer::score(&analyzer::analyze(pwd)));
推荐加密算法
Argon2 是赢得密码哈希竞赛(PHC)的密码哈希函数。
fn argon2() -> Result<(), argon2::password_hash::errors::Error> {
use argon2::{
password_hash::{
rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString,
},
Argon2,
};
use passwords::{analyzer, scorer};
let pwd = "ARG2on&@!略";
let password = pwd.as_bytes(); // Bad password; don't actually use!
let salt = SaltString::generate(&mut OsRng);
// Argon2 with default params (Argon2id v19)
let argon2 = Argon2::default();
// Hash password to PHC string ($argon2id$v=19$...)
let password_hash = argon2.hash_password(password, &salt)?.to_string();
// Verify password against PHC string.
//
// NOTE: hash params from `parsed_hash` are used instead of what is configured in the
// `Argon2` instance.
let parsed_hash = PasswordHash::new(&password_hash)?;
assert!(Argon2::default()
.verify_password(password, &parsed_hash)
.is_ok());
println!("{}", &password_hash);
Ok(())
}
PBKDF2 美国标准
fn pbkdf2() {
const CREDENTIAL_LEN: usize = digest::SHA512_OUTPUT_LEN;
let n_iter = NonZeroU32::new(100_000).unwrap();
let rng = rand::SystemRandom::new();
let mut salt = [0u8; CREDENTIAL_LEN];
rng.fill(&mut salt);
let password = "Guess Me If You Can!";
let mut pbkdf2_hash = [0u8; CREDENTIAL_LEN];
pbkdf2::derive(
pbkdf2::PBKDF2_HMAC_SHA512,
n_iter,
&salt,
password.as_bytes(),
&mut pbkdf2_hash,
);
println!("Salt: {}", HEXUPPER.encode(&salt));
println!("PBKDF2 hash: {}", HEXUPPER.encode(&pbkdf2_hash));
let should_succeed = pbkdf2::verify(
pbkdf2::PBKDF2_HMAC_SHA512,
n_iter,
&salt,
password.as_bytes(),
&pbkdf2_hash,
);
let wrong_password = "Definitely not the correct password";
let should_fail = pbkdf2::verify(
pbkdf2::PBKDF2_HMAC_SHA512,
n_iter,
&salt,
wrong_password.as_bytes(),
&pbkdf2_hash,
);
assert!(should_succeed.is_ok());
assert!(!should_fail.is_ok());
}
如何管理你的口令
生活中各种形形色色的密码(口令)数不胜数,如何管理这些密码也是一件十分重要的事情。
使用诸如LastPass、1Password等专业的密码管理器能够同时兼顾密码的安全和便捷。
拓展思考:常用的账号密码基本都是大小写英文字母、数字、特殊字符的组合,有没有可能使用简体/繁体中文或者其他字符呢?就好比图形验证码通常都使用数字、大小写英文字母,后来演变成12306选择同类图片、手动补齐图片拼图,依次点击指定的文字符号等方式?
参考
- PBKDF2
- How to encrypt user passwords(如何加密用户口令)
- 全平台最佳密码管理工具大全 全平台最佳密码管理工具大全:支持 Windows、Linux、Mac、Android、iOS 以及企业应用