1.MD5salt简介
作用:加密或者签名(可以对比两个文档是否完全相同,tomcat.zip,tomcat.md5.zip),且经过加密的结果是一个16进制的32位长度的字符串,不可逆(网上破解的都是一些简单的密码:如123456,且用的是穷举法破解)
2.测试三种加密的输出结果
1.使用MD5加密:
// MD5加密
Md5Hash md5Hash = new Md5Hash("123");
System.out.println(md5Hash.toHex());
// MD5+salt加密
Md5Hash md5Hash1 = new Md5Hash("123","X0*7ps");
System.out.println(md5Hash1.toHex());
// MD5+salt+Hash散列,1024次
Md5Hash md5Hash2 = new Md5Hash("123", "X0*7ps", 1024);
System.out.println(md5Hash2.toHex());
输出结果:
获得三个不同的密码串
3.模拟前后端加密过程
public class MD5main {
public static void main(String[] args) {
// 创建SecurityManager
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
Myrealm realm = new Myrealm();
//设置realm使用hash凭证匹配器
HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();
//使用算法
credentialsMatcher.setHashAlgorithmName("md5");
//散列次数
credentialsMatcher.setHashIterations(1024);
realm.setCredentialsMatcher(credentialsMatcher);
//注入realm
defaultSecurityManager.setRealm(realm);
// 安全工具类设置安全管理器
SecurityUtils.setSecurityManager(defaultSecurityManager);
// 获取subject
Subject subject = SecurityUtils.getSubject();
// 创建token,模拟前端传来的值,放入token,
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("zhangsan","123");
try{
//执行登录会跳转去自定义的realm,去比对用户名和密码
subject.login(usernamePasswordToken);
System.out.println("登陆成功");
}catch (UnknownAccountException e){
e.printStackTrace();
System.out.println("用户名错误");
}catch (IncorrectCredentialsException e){
e.printStackTrace();
System.out.println("密码错误");
}finally{}
}
}
自定义realm类:
public class Myrealm extends AuthorizingRealm {
// 授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
//认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//从token中获取用户名
String name= (String)authenticationToken.getPrincipal();
//模拟数据库验证用户名和密码
// 前端传来的是经过MD5加密盐值和散列的密码
if("zhangsan".equals(name)){
/*参数一:数据库用户名,参数二:数据库MD5+salt之后的密码,参数三:注册时随机盐,参数四:realm名字*/
return new SimpleAuthenticationInfo(
name,
"e4f9bf3e0c58f045e62c23c533fcf633",
ByteSource.Util.bytes("X0*7ps"),
this.getName()
);
}
return null;
}
}
根据百知教育视频笔记:https://www.bilibili.com/video/BV1uz4y197Zm?from=search&seid=3459873702021975265