API安全(六)-密码加密

2021-01-15 18:13

阅读:646

标签:shp   常见   修改密码   数据   salt   依赖   邮箱   color   vat   

1、密码为什么要加密

  存在数据库中的密码如果是明文,一旦数据库数据泄漏了,别人就可以拿着你的账号密码为所欲为。更何况有很多人在各个平台的用户名密码都是一致的。所以用户的密码,一定要加密存储。

2、加密算法的种类

  2.1、对称加密,指的是需要对加密和解密使用相同密钥的加密算法。常见的对称加密算法有:DES、3DES、AES等。

  2.2、非对称加密,它需要两个密钥,一个称为公钥(public key),一个称为私钥(private key)。加密和解密使用两个不同的密钥。例如:甲生成一对密钥,并将其中的一把作为公钥向其他人公开,得到该公钥的乙使用该密钥对信息进行加密后在发送给甲,甲使用自己保存的另一把私钥,对加密后的信息进行解密。常见的非对称加密算法有RSA、DSA等。

  2.3、单向hash算法,就是把任意长的消息串转化为固定长度的输出串的一种算法。一般用户信息摘要。常见的有MD5、SHA、MAC等。

  2.4、加盐hash算法,盐(Salt),在密码学中,是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串。这个在散列中加入字符串的方式称为“加盐”。其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情景中,这个处理可以增加额外的安全性。

3、密码加密的算法选择

  3.1、可逆的算法不要选,会增加密码泄漏的风险。

  3.2、MD5不要选,MD5并不是一个加密算法,而是一个信息摘要算法,可通过彩虹表进行破解,且相同明文加密后的密文是一致的,一旦破解出来一个,其余相同的也都知道了。

  3.3、不要加固定的盐,比如说用户名,邮箱等,如果数据库被攻破了,盐会被拿到。一旦盐泄漏,根据盐重新建立彩虹表可以进行破解。

所以用于密码加密的算法最好是,不可逆的,且使用随机盐,常用做密码加密的算法有bcrypt、scrypt。

4、使用bcrypt对密码进行加密(推荐使用)

  4.1、导入依赖

org.mindrot
    jbcrypt
    0.4

  4.2、对密码进行加密

    @Override
    @Transactional(rollbackFor = Exception.class)
    public UserDTO create(UserDTO userDTO) {
        /*
         * 将密码加密成密文
         */
        userDTO.setPassword(BCrypt.hashpw(userDTO.getPassword(),BCrypt.gensalt()));
        UserDO userDO = new UserDO();
        BeanUtils.copyProperties(userDTO, userDO);
        userRepository.save(userDO);
        userDTO.setId(userDO.getId());
        return userDTO;
    }

  4.3、认证过滤器,修改密码校验方式

技术图片

 

   4.4、创建两个用户,并使用相同的密码123456,查看数据库中存储的密码是不一致的

技术图片

  4.5、测试认证功能

技术图片

 

  这样,我们数据库中的密码就安全多了。

5、使用scrypt对密码进行加密

  5.1、导入依赖

com.lambdaworks
    scrypt
    1.4.0

  5.2、对密码进行加密

userDTO.setPassword(SCryptUtil.scrypt(userDTO.getPassword(),2 

  5.3、认证过滤器,修改密码校验方式

技术图片

  效果与使用bcrypt类似,该算法唯一的缺点就是慢。

 

源码地址:https://github.com/caofanqi/study-security/tree/dev-encryption


API安全(六)-密码加密

标签:shp   常见   修改密码   数据   salt   依赖   邮箱   color   vat   

原文地址:https://www.cnblogs.com/caofanqi/p/12238269.html


评论


亲,登录后才可以留言!