Java Spring Shiro 安全框架:(八)加密算法

加密算法

    • 1.手动处理数据时,自行使用MD5加密
    • 2.使用Shiro的MD5方式进行加密

  • 在身份认证的过程中往往都会涉及到加密,如果不加密,这个时候信息就会非常的不安全,shiro 中提供的算法比较多
  • 如 MD5 SHA 等

1.手动处理数据时,自行使用MD5加密

package com.shiro3;

import org.apache.shiro.crypto.hash.Md5Hash;

public class TestDemo {

    public static void main(String[] args) {
        //使用MD5加密
        Md5Hash md5 = new Md5Hash("DQC");
        System.out.println("DQC==" + md5);
        //加盐
        md5 = new Md5Hash("DQC", "DQCGM");
        System.out.println("DQC==" + md5);
        //迭代次数
        md5 = new Md5Hash("DQC", "DQCGM", 2);
        System.out.println("DQC==" + md5);
    }
}

运行结果:
结果

2.使用Shiro的MD5方式进行加密

数据库:
表

[main]
#设置securityManager中realm
credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
#设置加密方式
credentialsMatcher.hashAlgorithmName=md5
#设置迭代次数
credentialsMatcher.hashIterations=2

userRealm=com.shiro3.UserRealm
userRealm.credentialsMatcher=$credentialsMatcher
securityManager.realms=$userRealm
package com.shiro3;

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.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class UserRealm extends AuthorizingRealm {

    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/shiro", "root", "Root");
            PreparedStatement prepareStatement = conn.prepareStatement("select  uname,pwd  from  admin ");
            ResultSet rs = prepareStatement.executeQuery();
            System.out.println(rs);
            while (rs.next()) {
            	//ByteSource.Util.bytes("DQCGM")是加盐的盐是什么
                SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(rs.getString("uname"), rs.getString("pwd"), ByteSource.Util.bytes("DQCGM"), "userRealm");
                return info;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
    }
}
package com.shiro3;

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.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;

public class TestB {

    public static void main(String[] args) {

        /*Realm*/

        //[1]解析shiro.ini文件
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-jdbc3.ini");
        //[2]通过SecurityManager工厂获得SecurityManager实例
        SecurityManager securityManager = factory.getInstance();
        //[3]把SecurityManager对象设置到运行环境中
        SecurityUtils.setSecurityManager(securityManager);
        //[4]通过SecurityUtils获得主体subject
        Subject subject = SecurityUtils.getSubject();
        //[5]书写自己输入的账号和密码---相当于用户自己输入的账号和密码
        //我们拿着自己书写用户名密码去和shiro.ini 文件中的账号密码比较
        UsernamePasswordToken token = new UsernamePasswordToken("DQCGM", "123");
        try {
            //[6]进行身份的验证
            subject.login(token);
            //[7]通过方法判断是否登录成功
            if (subject.isAuthenticated()) {
                System.out.println("登录成功");
            }
        } catch (IncorrectCredentialsException e) {
            System.out.println("登录失败");
        } catch (UnknownAccountException e) {
            System.out.println("用户名不正确");
        }
    }
}

运行结果:
结果

热门文章

暂无图片
编程学习 ·

php编写的旅游网站

使用PHP编写一个简单的旅游网站! wampserver集成环境编写php+mysql使用最新的Bootstrap(v4.5.0)框架详细的前端功能详细的用户后台管理具体又详细的文件上传函数文件提取链接:https://pan.baidu.com/s/1EeS4o4FnoSWLQ8f_oFg0CQ 提取码:idqm
暂无图片
编程学习 ·

【MPI编程实现梯形积分法】

MPI编程实现梯形积分法1.1问题描述1.2算法实现1.3结果实现与分析1.4源码实现 1.1问题描述 实现课件中的梯形积分法的MPI编程熟悉并掌握MPI编程方法,规模自行设定,可探讨不同规模对不同实现方式的影响。实验环境:联想笔记本,集成开发环境:Visual Studio 1.2算法实现 每个进…
暂无图片
编程学习 ·

服务器使用Nginx部署Springboot项目(jar包)

部署SpringBoot项目到后台Nginx实现多项目反向代理1,将java项目打成jar包2.准备工具3.将jar包传入服务器3.使用Xshell运行jar包4.下载安装nginx5.配置nginx.conf6通过域名访问(成功) 1,将java项目打成jar包 这里我用到的是maven工具这里有两个项目,打包完成后一个为demo.jar,另…
暂无图片
编程学习 ·

selenium 点击按钮,打开新标签页后,无法定位新标签页的元素

使用selenium爬取页面时,在弹出浏览器界面上我们明明看到已经自动到达新标签页,却无法定位新标签页的元素原因:实际上程序并没有随浏览器上所看的标签页改变而该改变,也就是说我们在浏览器上看到已经到达标签2,实际上程序默认的还是标签1解决方案:browser.switch_to_wind…
暂无图片
编程学习 ·

HCIP-RS-H12-221题库以及解析(部分)

不定期更新题库和解析,原题库不包含解析,解析有错误或不对的地方欢迎评论指正 1.由于属性AS-path不能在AS内起作用,所以规定BGP路由器不会宣告任何从IBGP对等体来的更新信息给其对等体 (√) 2.通过重发布命令注入BGP的路由,其orgin的属性为incomplete (√) 3.自制系统…
暂无图片
编程学习 ·

基于Token的身份验证的原理

目录1 发展史2 Cookie3 Session3.1 cookie和session的区别4 Token4.1 传统方式——基于服务器的验证4.2 基于服务器验证方式暴露的一些问题4.3 基于Token的验证原理4.5 Tokens的优势1 发展史1、很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记…
暂无图片
编程学习 ·

难得一遇的5G大屏手机 荣耀X10 Max配置分析

6月22日,荣耀通过微博证实了荣耀X10 Max的存在,并宣布将会在7月2日正式发布。消息一出可谓是让很多人非常欣喜,尤其是等了多年大屏手机的用户。荣耀X10 Max不仅是荣耀在5G时代发布的首款大屏手机,也是荣耀时隔两年,继荣耀8X后的续作。那么这款5G大屏手机有哪些特点和配置呢…
暂无图片
编程学习 ·

springboot 整合xcf 发布 webservice

Spring Boot集成webService在pom添加依赖<!--WerbService CXF依赖 start--> <dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId> </dependency> <dependency><groupId>org.…
暂无图片
编程学习 ·

IntelliJ IDEA中使用markdown画流程图

安装 Scene Builder下载安装:https://gluonhq.com/products/scene-builder/ 中 Download Scene Builder for Java 8IntelliJ IDEA -> Preferences -> Languages and Frameworks -> JavaFX 中的 "Path to SceneBuilder" 设置为 "/Applications/SceneBu…
暂无图片
编程学习 ·

考研初试备考,感谢曾经努力的自己

人生的第一篇博客,说晚不晚,以后我会好好学习IT技术,并腾出时间写写东西,想写这篇文章有很长时间了,当初写好了也没有发布,现在作为一个过来人润色一番,着手发布。找不到合适的平台、合适的时间、合适的场地、合适的心情以及合适的内容,现在才开始在CSDN动手写东西,然…
暂无图片
编程学习 ·

SQL函数

SQL拥有很多可用于计数和计算的内建函数。SQL Aggregat函数计算从列中取得的值,返回一个单一的值。有用的Aggregate函数如下:AVG() - 返回平均值COUNT() - 返回行数FIRST() - 返回第一个记录的值LAST() - 返回最后一个记录的值MAX() - 返回最大值MIN() - 返回最小值SUM() - 返…
暂无图片
编程学习 ·

Spring MVC的运行原理(简答)

a)(浏览器)用户发送请求 b)前端控制器(dispatcherServlet)接收(他会委托其他模块进行真正的业务和数据处理 ) c)向handlermapping发送url查找相应的方法(handlermapping中储存的是url 和方法的键值对) d)返回处理器(“地址”)。 e)前端控制器发送处理器“地址”给处理…
暂无图片
编程学习 ·

Java工厂模式解耦合的例子

目录第一个例子第二个例子第三个例子第四个例子Reference 最终项目路径如下:第一个例子 假设有如下接口, package service;public interface Notice {public void work(String message); }实现类如下, package service;public class NoticeImpl implements Notice {@Overrid…
暂无图片
编程学习 ·

GIS开发:如何开发一个MBTiles Server

MBTiles是一个存储地图切片的数据库,以SQLite数据为基础,将地图切片按照缩放级别、横行和纵行的顺序,存储在其中。 常见的Geoserver可以加载插件,对MBTiles进行发布,github上也有开源的MBTiles Server,也可以进行MBTiles发布。 在只需要地图的切片情况下,如何进行一个MB…
暂无图片
编程学习 ·

TextRNN的PyTorch实现

本文介绍一下如何使用PyTorch复现TextRNN,实现预测一句话的下一个词 参考这篇论文Finding Structure in Time(1990),如果你对RNN有一定的了解,实际上不用看,仔细看我代码如何实现即可。如果你对RNN不太了解,请仔细阅读我这篇文章RNN Layer,结合PyTorch讲的很详细 现在问题…
暂无图片
编程学习 ·

DC-8

靶机:192.168.56.108攻击机:192.168.56.1关键字:SQL注入漏洞,John工具,eixm探索靶机DC-8 web主页网页sql注入漏洞浏览下网页,关注可能出现漏洞的地方像这种?nid=1的地方很容易出现sql注入漏洞,一般就是注入引号测试。这里回显报错,那估计可以注入了。狠一点就直接拿去…
暂无图片
编程学习 ·

python 使用过程遇到的问题

1.用Python复制文件的9个方法 https://zhuanlan.zhihu.com/p/35725217 2.python命令行解析之parse_known_args()函数和parse_args() https://blog.csdn.net/lyb3b3b/article/details/82822734
暂无图片
编程学习 ·

期货软件开发与平台搭建注意事项

期货软件开发和期货平台搭建需要注意很多内容,关系到后期运营的是否正常稳定。现在市面上的很多的期货交易系统软件平台,基本都支持支持PC、安卓APP端,微信端、且具备风控系统、杠杆系统、交易系统、在线出入金、后台管理系统、代理系统、股票数据行情等功能。但是行业鱼龙混…
暂无图片
编程学习 ·

知乎上这么多推崇学 Python 入 IT 行的,如果他们学完 Python 这一套找不到工作怎么办?

作者:小伯爵 链接:https://www.zhihu.com/question/60787862/answer/772968750 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。我是自学python转行的,然后两周内找到了工作。我的经验是,转行并不难,没人指导就很难。我在北方读书,二本…