一.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实现用户加密相关推荐

  1. Shiro+springboot+mybatis+EhCache(md5+salt+散列)认证与授权-03

    从上文:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02 当每次进行刷新时,都会从数据库重新查询数据进行授权操作,这样无疑给数据库造成很大的压力,所以需要引入 ...

  2. Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02

    代码延续地址:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-01 1.创建t_role角色表(比如管理员admin,普通用户user等),创建t_pers权限表 ...

  3. Shiro+springboot+mybatis(md5+salt+散列)认证与授权-01

    这个小项目包含了注册与登录,使用了springboot+mybatis+shiro的技术栈:当用户在浏览器登录时发起请求时,首先这一系列的请求会被拦截器进行拦截(ShiroFilter),然后拦截器根 ...

  4. shiro认证+授权(使用MD5+salt+散列加密)

    通过上文自定义realm分析源码可得https://blog.csdn.net/Kevinnsm/article/details/11183124 用户认证在doGetAuthenticationIn ...

  5. 应用密码学的笑话之MD5+Salt不安全

    这段时间诸多爆库的新闻,里面有许多饶有趣味的事情.那些用简单密码,或者一个密码走天下的笑话就不说了,咱说点有内涵的.(这篇文章是给IT界的人看的,如果你看不懂,我会准备一个简单的"如何辨别密 ...

  6. MD5 + salt 的加密算法

    2019独角兽企业重金招聘Python工程师标准>>> MD5 + salt 的加密算法   对于这次泄露门事件,因为本人的账号(CSDN)有在内所以很想说shit-同时觉得csdn ...

  7. 使用md5+salt+hash散列查询

    一.说明 1.分析 通过MD5+salt+hash散列进行用户登录查询. 重点:(1)加密存储到数据库(2)验证登录用户信息和数据库信息是否一致 2.目录结构 二.范例 1.调用类 (1)代码块 pa ...

  8. 浅谈Md5+Salt加密

    一 为什么需要加密? 比如当前有个用户进行注册,他输入的账号密码是"ltl"和"123456",那么我们肯定要将账号密码保存到数据库中.在没有接触过" ...

  9. golang Md5+salt

    写网络编程时,需要保存用户的用户名和密码,防止被盗用或者误用.目前计较安全的做法是:Md5+salt. md5简单讲就是单向不可逆散列.如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然 ...

最新文章

  1. Apache用户认证、域名跳转、Apache访问日志
  2. [译] 2019 年的 9 大设计趋势
  3. jQ 插件 iscroll.js
  4. React入门0x014: Fragment
  5. 四年后十大最赚钱行业
  6. JS事件冒泡机制和兼容性添加事件
  7. 组合数据类型练习、英语词频统计
  8. node --- 创建一个Socket客户端连接到服务器
  9. CF650E-Clockwork Bomb【并查集】
  10. 浅入深出被人看扁的逻辑回归!
  11. UVA11040 Add bricks in the wall【数学】
  12. 安卓手机当电脑摄像头(DroidCam网盘及使用方法)
  13. 算法入门:股票最大收益
  14. 虚拟主机需要备案吗?
  15. 【《机器学习》周志华学习笔记2.3.4】~模型评估与选择-代价敏感错误率与代价曲线
  16. 计算机网卡大小怎么查看,查看电脑网卡是100M还是1000M的方法
  17. 判断div是否在可视区内
  18. Hadoop入门——初识Hadoop
  19. Rust结伴学习 — 前言
  20. 你知道什么是软中断吗?

热门文章

  1. Solide work每日一练
  2. ubuntu 强制退出_强制在Ubuntu中退出无响应的图形应用程序
  3. 初步了解区块链技术落地——FISCO BCOS 快速搭建区块链
  4. Cocos技术派 | 3d人物渲染详细教程
  5. Alpha冲刺——事后诸葛亮
  6. [PPPOE]PPPD分析
  7. 这份关于高三的秘籍,一定要知道!
  8. 短租APP开发定制快速搭建
  9. 爱奇艺自研DRM技术斩获国家级专利奖 持续为内容创作者提供更高等级版权保护...
  10. 潮汐监测站点 api数据接口