API安全-密码加密

Posted caofanqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了API安全-密码加密相关的知识,希望对你有一定的参考价值。

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、导入依赖

<dependency>
    <groupId>org.mindrot</groupId>
    <artifactId>jbcrypt</artifactId>
    <version>0.4</version>
</dependency>

  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、导入依赖

<dependency>
    <groupId>com.lambdaworks</groupId>
    <artifactId>scrypt</artifactId>
    <version>1.4.0</version>
</dependency>

  5.2、对密码进行加密

userDTO.setPassword(SCryptUtil.scrypt(userDTO.getPassword(),2 << 14,8,1));

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

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

 

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


以上是关于API安全-密码加密的主要内容,如果未能解决你的问题,请参考以下文章

WPYOU主题加密码代码的解码

生成加密安全令牌

开放API接口及其安全性

SpringCloud Gateway API接口安全设计(加密 签名)

SpringCloud Gateway API接口安全设计(加密 签名)

Spring Cloud 与微服务学习总结(17)—— SpringCloud Gateway API 接口安全设计(加密 签名安全)