第二十六 口令(password)

本文探讨了口令在网络安全中的重要性,提出了保护口令的策略,如使用复杂且加密的强密码,推荐使用Argon2和PBKDF2加密算法,并强调了密码管理器在管理众多账号密码中的作用。
摘要由CSDN通过智能技术生成

口令(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());
}

如何管理你的口令

生活中各种形形色色的密码(口令)数不胜数,如何管理这些密码也是一件十分重要的事情。

使用诸如LastPass1Password等专业的密码管理器能够同时兼顾密码的安全和便捷。

拓展思考:常用的账号密码基本都是大小写英文字母、数字、特殊字符的组合,有没有可能使用简体/繁体中文或者其他字符呢?就好比图形验证码通常都使用数字、大小写英文字母,后来演变成12306选择同类图片、手动补齐图片拼图,依次点击指定的文字符号等方式?

参考

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值