安全认证系列之-密码进化史、密码编译器、验证规则


前言

写这篇博客的目的是了解下登录密码的进化史,好清楚自己以后登录密码的设置方式,已经方向,然后如果系统密码编码格式固定,后期新的密码生成规则出来以后,想要升级到更高的版本,我们的密码该如何进行升级。


一、密码进化史

在这里插入图片描述

  1. 明文存储。
  2. 限制长度。
  3. 多字符形式,定期更改密码,前后两次密码还不能相同。
  4. 多因子验证,二次验证,用户名密码+短信验证码登录。
  5. 指纹、人脸识别。

二、密码存储安全进化史

在这里插入图片描述

  1. 明文存储(对于黑客来说攻克数据库性价比最高)。
  2. 哈希算法,对密码进行哈希(数据库攻克也没用,解析不了密码),但是黑客可以建彩虹表,预先计算哈希值,然后拿到哈希值跟数据库哈希作比较,还是可以进行破解。
  3. 加盐,密码+盐 做哈希,哪怕黑客哈希 匹配上也没用 根本就不是密码。
  4. 自适应,可以进行多次哈希。
  5. 未来未知 地理+无密码化+生物芯片等,多因子认证。
    在这里插入图片描述

三、密码编译器

我们做系统的时候都会定义一个密码编译器,例如:常见的Md5加密,但是随着技术的进步,Md5可能也不是那么安全,那么对于一个使用比较老的系统,那我们需要改进它的密码加密策略,让加密更安全。于是我们需要多种编码器共存,可以不断的提升我们的密码加密策略。
在这里插入图片描述

四、密码验证规则

  1. 密码的验证比较复杂,使用Passay框架进行验证。
<dependency>
  <groupId>org.passay</groupId>
  <artifactId>passay</artifactId>
  <version>1.6.0</version>
</dependency>

代码示例:

package com.imooc.uaa.validation;

import com.imooc.uaa.validation.annotation.ValidPassword;
import lombok.RequiredArgsConstructor;
import lombok.val;
import org.passay.*;
import org.passay.spring.SpringMessageResolver;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;

@RequiredArgsConstructor
public class PasswordConstraintValidator implements ConstraintValidator<ValidPassword, String>
{
    private final SpringMessageResolver messageResolver;

    @Override
    public void initialize(final ValidPassword constraintAnnotation) {}

    @Override
    public boolean isValid(final String password, final ConstraintValidatorContext context)
    {
        val validator = new PasswordValidator(messageResolver, Arrays.asList(
            // 长度规则:8 - 30 位
            new LengthRule(8, 30),
            // 至少有一个大写字母
            new CharacterRule(EnglishCharacterData.UpperCase, 1),
            // 至少有一个小写字母
            new CharacterRule(EnglishCharacterData.LowerCase, 1),
            // 至少有一个数字
            new CharacterRule(EnglishCharacterData.Digit, 1),
            // 至少有一个特殊字符
            new CharacterRule(EnglishCharacterData.Special, 1),
            // 不允许连续 5 个字母,按字母表顺序
            // alphabetical is of the form 'abcde', numerical is '34567', qwery is 'asdfg'
            // the false parameter indicates that wrapped sequences are allowed; e.g. 'xyzabc'
            new IllegalSequenceRule(EnglishSequenceData.Alphabetical, 5, false),
            // 不允许 5 个连续数字
            new IllegalSequenceRule(EnglishSequenceData.Numerical, 5, false),
            // 不允许 QWERTY 键盘上的三个连续相邻的按键所代表的字符
            new IllegalSequenceRule(EnglishSequenceData.USQwerty, 5, false),
            // 不允许包含空格
            new WhitespaceRule()));
        val result = validator.validate(new PasswordData(password));
        if (result.isValid())
        {
            return true;
        }
        context.disableDefaultConstraintViolation();
        context.buildConstraintViolationWithTemplate(String.join(",", validator.getMessages(result))).addConstraintViolation();
        return false;
    }
}
  1. 封装验证逻辑在注解中,有效的剥离验证逻辑和业务逻辑。
  2. 对于两个以上属性的复合验证,可以写一个应用于类的注解。

总结

密码的安全性对于企业来讲还是非常的重要的,一个客户的密码被攻克盗用,负面影像及损失是难以估量的,所以了解密码的加密及演进,提升我们密码的破解难度是非常有必要的。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页

打赏

谦奕爸爸

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者