Md5+salt实现用户加密
一.md5
1.1 作用
一般用来进行加密或者签名
特点:md5内容不可逆,相同的内容不论执行多少次,md5加密算法生成的结果都是一致的。
结果:生成的结果是一个32位的16进制字符串。
二 md5+salt
salt说白了就是随机的字符串
2.1 md5+salt的使用
注册时md5(输入明文密码+随机盐字符串)生成加密密码p1,随机盐字符串r,都存储到数据库中。
登录时通过用户名查询该用户对应的加密密码p1和随机盐字符串r,按照注册时生成的规则:md5(输入明文密码+随机盐字符串)=p2,
这次登录生成的新的加密字符串p2和从数据库查询出的加密字符串p1进行比较判断。相同则密码正确,否则错误。
三 md5+salt+hash散列案例
3.1 加密
package com.shiro.ljf.demo.test;import org.apache.shiro.crypto.hash.Md5Hash;public class TestShiroMD5 {public static void main(String[] args) {//创建一个md5算法
// Md5Hash md5Hash = new Md5Hash();
// md5Hash.setBytes("123".getBytes());
// String s = md5Hash.toHex();
// System.out.println(s);//使用md5Md5Hash 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散列Md5Hash md5Hash2 = new Md5Hash("123", "X0*7ps", 1024);System.out.println(md5Hash2.toHex());}
}
结果:
202cb962ac59075b964b07152d234b70
8a83592a02263bfe6752b2b5b03a4799
e4f9bf3e0c58f045e62c23c533fcf633
3.2 使用salt+md5+hash散列
package com.shiro.ljf.demo.test;import com.shiro.ljf.demo.sptshirodemo.shiro.CustomerMd5Realm;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.subject.Subject;import java.util.Arrays;public class TestCustomerMd5RealmAuthenicator {public static void main(String[] args) {//创建安全管理器DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();//注入realmCustomerMd5Realm realm = new CustomerMd5Realm();//设置realm使用hash凭证匹配器HashedCredentialsMatcher credentialsMatcher = new HashedCredentialsMatcher();//使用算法credentialsMatcher.setHashAlgorithmName("md5");//散列次数credentialsMatcher.setHashIterations(1024);realm.setCredentialsMatcher(credentialsMatcher);defaultSecurityManager.setRealm(realm);//将安全管理器注入安全工具SecurityUtils.setSecurityManager(defaultSecurityManager);//通过安全工具类获取subjectSubject subject = SecurityUtils.getSubject();//认证UsernamePasswordToken token = new UsernamePasswordToken("lisi", "123");try {subject.login(token);System.out.println("登录成功");} catch (UnknownAccountException e) {e.printStackTrace();System.out.println("用户名错误");}catch (IncorrectCredentialsException e){e.printStackTrace();System.out.println("密码错误");}//授权if(subject.isAuthenticated()){}}
}
自定义reaml:
package com.shiro.ljf.demo.sptshirodemo.shiro;import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;/*** 使用自定义realm 加入md5 + salt +hash*/
public class CustomerMd5Realm extends AuthorizingRealm {//授权@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {String primaryPrincipal = (String) principals.getPrimaryPrincipal();System.out.println("身份信息: "+primaryPrincipal);//根据身份信息 用户名 获取当前用户的角色信息,以及权限信息 xiaochen admin userSimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();//将数据库中查询角色信息赋值给权限对象simpleAuthorizationInfo.addRole("admin");simpleAuthorizationInfo.addRole("user");//将数据库中查询权限信息赋值个权限对象simpleAuthorizationInfo.addStringPermission("user:*:01");simpleAuthorizationInfo.addStringPermission("product:create");return simpleAuthorizationInfo;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {//获取身份信息String principal = (String) token.getPrincipal();//根据用户名查询数据库if ("lisi".equals(principal)) {//参数1: 数据库用户名 参数2:数据库md5+salt之后的密码 参数3:注册时的随机盐 参数4:realm的名字//用户输入的密码+加上从数据库获取的盐,生成新的加密串,和从数据库加载的串进行比较,这个动作就是在shiro底层自动完成的,这里只需要在//SimpleAuthenticationInfo设置好对应的参数就行。return new SimpleAuthenticationInfo(principal,"e4f9bf3e0c58f045e62c23c533fcf633",ByteSource.Util.bytes("X0*7ps"),this.getName());}return null;}
}
3.3 执行结果:
Md5+salt实现用户加密相关推荐
- Shiro+springboot+mybatis+EhCache(md5+salt+散列)认证与授权-03
从上文:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02 当每次进行刷新时,都会从数据库重新查询数据进行授权操作,这样无疑给数据库造成很大的压力,所以需要引入 ...
- Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02
代码延续地址:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-01 1.创建t_role角色表(比如管理员admin,普通用户user等),创建t_pers权限表 ...
- Shiro+springboot+mybatis(md5+salt+散列)认证与授权-01
这个小项目包含了注册与登录,使用了springboot+mybatis+shiro的技术栈:当用户在浏览器登录时发起请求时,首先这一系列的请求会被拦截器进行拦截(ShiroFilter),然后拦截器根 ...
- shiro认证+授权(使用MD5+salt+散列加密)
通过上文自定义realm分析源码可得https://blog.csdn.net/Kevinnsm/article/details/11183124 用户认证在doGetAuthenticationIn ...
- 应用密码学的笑话之MD5+Salt不安全
这段时间诸多爆库的新闻,里面有许多饶有趣味的事情.那些用简单密码,或者一个密码走天下的笑话就不说了,咱说点有内涵的.(这篇文章是给IT界的人看的,如果你看不懂,我会准备一个简单的"如何辨别密 ...
- MD5 + salt 的加密算法
2019独角兽企业重金招聘Python工程师标准>>> MD5 + salt 的加密算法 对于这次泄露门事件,因为本人的账号(CSDN)有在内所以很想说shit-同时觉得csdn ...
- 使用md5+salt+hash散列查询
一.说明 1.分析 通过MD5+salt+hash散列进行用户登录查询. 重点:(1)加密存储到数据库(2)验证登录用户信息和数据库信息是否一致 2.目录结构 二.范例 1.调用类 (1)代码块 pa ...
- 浅谈Md5+Salt加密
一 为什么需要加密? 比如当前有个用户进行注册,他输入的账号密码是"ltl"和"123456",那么我们肯定要将账号密码保存到数据库中.在没有接触过" ...
- golang Md5+salt
写网络编程时,需要保存用户的用户名和密码,防止被盗用或者误用.目前计较安全的做法是:Md5+salt. md5简单讲就是单向不可逆散列.如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然 ...
最新文章
- Apache用户认证、域名跳转、Apache访问日志
- [译] 2019 年的 9 大设计趋势
- jQ 插件 iscroll.js
- React入门0x014: Fragment
- 四年后十大最赚钱行业
- JS事件冒泡机制和兼容性添加事件
- 组合数据类型练习、英语词频统计
- node --- 创建一个Socket客户端连接到服务器
- CF650E-Clockwork Bomb【并查集】
- 浅入深出被人看扁的逻辑回归!
- UVA11040 Add bricks in the wall【数学】
- 安卓手机当电脑摄像头(DroidCam网盘及使用方法)
- 算法入门:股票最大收益
- 虚拟主机需要备案吗?
- 【《机器学习》周志华学习笔记2.3.4】~模型评估与选择-代价敏感错误率与代价曲线
- 计算机网卡大小怎么查看,查看电脑网卡是100M还是1000M的方法
- 判断div是否在可视区内
- Hadoop入门——初识Hadoop
- Rust结伴学习 — 前言
- 你知道什么是软中断吗?