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安全-密码加密的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud Gateway API接口安全设计(加密 签名)
SpringCloud Gateway API接口安全设计(加密 签名)
Spring Cloud 与微服务学习总结(17)—— SpringCloud Gateway API 接口安全设计(加密 签名安全)