1.Spring Boot2+Shiro:加密密码注册, 登陆验证实现2.springsecurity+BCryptPasswordEncoder实现加密注册登录
一.前言
我在这与大家分享一下登陆验证时的一些问题和实现。应用考虑到安全,绝不能明文的方式保存密码(数据库不能存看得懂的秘密,一定程度也保证了用户的安全,同时也让很多攻破数据库的程序员没法瞎搞,比如 玩游戏出现用户的账号异地登陆之类的。。。)
有很多标准的算法比如SHA或者MD5(MD5可以用彩虹表暴力破解 后面会讲解如何破解),MD5结合salt(盐)是一个不错的选择毕竟加了盐的食物才会让黑客喝一壶嘛~
咱们的主题分别是:
1.springboot2+Shiro:BCrypt加密注册登录验证。
2.springboot2+springsecurity+BCryptPasswordEncoder加密注册登录验证
学习内容:
大纲一:springboot2+Shiro:BCrypt
1、 MD5与彩虹表介绍
2、 MD5结合salt(盐)实现项目注册与登陆功能
3、 Shiro整合BCrypt加密注册与登录
大纲二:springboot2+springsecurity+BCrypt
1、 环境搭建
2、 springsecurity整合BCrypt加密注册与登录
一:springboot2+Shiro
咱们先讲讲数据库错误做法
这种做法是不可取的~
MD5与彩虹表的爱恨交织
import org.apache.commons.codec.digest.DigestUtils;
//没用过md5的小伙伴别导错包了 是apache底下的包
@Test
void contextLoads() {
//使用md5生成一个密码为123456的密文
String md5Hex = DigestUtils.md5Hex("123456");
System.out.println(md5Hex);
}
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
接下来咱们就可以百度一波MD5破解
如果是使用MD5做的加密 有很多这种解密库 一套就有密码了,因为MD5算法加密出来的结果集是不变的 就好比123456加密后的密文就是:e10adc3949ba59abbe56e057f20f883e
感兴趣的小伙伴可以直接测试一下,看看结果是不是一样的~
为Shiro配置加MD5结合salt(盐)实现项目注册与登陆功能
先说说加盐,加盐 顾名思义就是加料,嗯 就是给盗数据的家伙加佐料,比如:在密码中加东西(密码123456+_qwe)然后再用MD5(123456_qwe)加密
登陆的同时用相同的方式一层层解密。
很多复杂的加密算法就是这样来的 比如:在密码的中加字符,头部加字符,尾部。。。制定好加密的规则,然后自己再根据规则进行解密。虽然会有一定的弊端,但别着急后续有更好的方法。
注册时加盐
- 注册用户的加密算法
注册的server方法中 以MD5加盐的方式保存信息
package com.sj.springshiro.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.sj.springshiro.mapper.UserMapper;
import com.sj.springshiro.pojo.User;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
/**
* @author sj
* @date 2020/11/24 - 15:53
*/
@Service
public class UserServiceImpl implements UserService
{
@Autowired
private UserMapper userMapper;
/**
String password=new SimpleHash(algorithmName,source,salt,hashIterations).toHex();
* 1.algorithmName:加密方式(很多种,目前咱们使用MD5)
*
* 2.source:简单理解就是传入的原始明文密码值
*
* 3.salt:盐值
*
* 4.hashIterations:加密散列次数
*
* 最终得到加密的密码 = MD5(明文密码 + 盐值)* 加密次数
*
* @param user
*/
public void login(User user){
String newpwd = new SimpleHash("MD5", user.getPassword(), ByteSource.Util.bytes(user.getUsername()),1).toHex();
user.setPassword(newpwd);
userMapper.insert(user);
}
}
这里的加密次数是否影响项目性能我没做具体的测试,有感兴趣的小伙伴可以测试一下然后在评论中给出结论~
Shiro配置
配置算法加密三步走:
- ShiroConfig中创建凭证匹配器 HashedCredentialsMatcher
- 为我们自定义的 Realm Bean 添加凭证匹配器 HashedCredentialsMatcher
- 修改Realm 类中 doGetAuthenticationInfo 方法的返回值 SimpleAuthenticationInfo 的构造方法
ShiroConfig
package com.sj.springshiro