前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shiro教程3(加密)

shiro教程3(加密)

作者头像
用户4919348
发布2019-04-02 11:40:09
7900
发布2019-04-02 11:40:09
举报
文章被收录于专栏:波波烤鸭波波烤鸭

  加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容

概念

数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为"密文",使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程。

加密分类

对称加密

  双方使用的同一个密钥,既可以加密又可以解密,这种加密方法称为对称加密,也称为单密钥加密。

非对称加密

  一对密钥由公钥和私钥组成(可以使用很多对密钥)。私钥解密公钥加密数据,公钥解密私钥加密数据(私钥公钥可以互相加密解密)。

加密算法分类

单向加密

  单向加密是不可逆的,也就是只能加密,不能解密。通常用来传输类似用户名和密码,直接将加密后的数据提交到后台,因为后台不需要知道用户名和密码,可以直接将收到的加密后的数据存储到数据库

双向加密

  通常分为对称性加密算法和非对称性加密算法,对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行 加解密了。非对称算法与之不同,发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消 息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理。

常见算法

算法

描述

DES(Data Encryption Standard)

数据加密标准,速度较快,适用于加密大量数据的场合;

3DES(Triple DES)

是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;

RC2和 RC4

用变长密钥对大量数据进行加密,比 DES 快;

IDEA(International Data Encryption Algorithm)

国际数据加密算法:使用 128 位密钥提供非常强的安全性;

RSA

由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;

DSA(Digital Signature Algorithm)

数字签名算法,是一种标准的 DSS(数字签名标准);

AES(Advanced Encryption Standard)

高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法;

BLOWFISH

它使用变长的密钥,长度可达448位,运行速度很快;

MD5 (Message-Digest Algorithm)

消息摘要算法,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致

MD5的使用

代码语言:javascript
复制
@Test
public void Md5Test() {
	// 对单个信息加密
	Md5Hash md5 = new Md5Hash("123456");
	System.out.println(md5.toString());
	// 加密添加盐值 增大解密难度
	md5 = new Md5Hash("123456","aaa");
	System.out.println(md5.toString());
	// 加密添加盐值 增大解密难度 2迭代两次
	md5 = new Md5Hash("123456","aaa",2);
	System.out.println(md5);
}

输出的结果:

代码语言:javascript
复制
e10adc3949ba59abbe56e057f20f883e
88316675d7882e3fdbe066000273842c
a7cf41c6537065fe724cc9980f8b5635

盐值的作用

  使用MD5存在一个问题,相同的password生成的hash值是相同的,如果两个用户设置了相同的密码,那么数据库中会存储两个相同的值,这是极不安全的,加Salt可以在一定程度上解决这一问题,所谓的加Salt方法,就是加点‘佐料’。其基本想法是这样的,当用户首次提供密码时(通常是注册时)由系统自动往这个密码里撒一些‘佐料’,然后在散列,而当用户登录时,系统为用户提供的代码上撒上相同的‘佐料’,然后散列,再比较散列值,来确定密码是否正确。 加盐的原理: 给原文加入随机数生成新的MD5的值

shiro中使用MD5加密

认证方法中修改

代码语言:javascript
复制
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
	// 获取账号信息
	String principal = (String) token.getPrincipal();
	// 正常逻辑此处应该根据账号去数据库中查询,此处我们默认账号为 root 密码123456
	// 验证账号
	if(!"root".equals(principal)){
		// 账号错误
		return null;
	}
	//String pwd = "123456";
	// 12345 根据 盐值 aaa 加密获取的密文
	//88316675d7882e3fdbe066000273842c  1次迭代的密文
	//a7cf41c6537065fe724cc9980f8b5635  2次迭代的密文
	String pwd = "88316675d7882e3fdbe066000273842c";
	// 验证密码
	AuthenticationInfo info = new SimpleAuthenticationInfo(
			principal, pwd,new SimpleByteSource("aaa"),"myrealm");
	return info;
}
在这里插入图片描述
在这里插入图片描述

ini.xml文件修改

代码语言:javascript
复制
[main]
#定义凭证匹配器
credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
#散列算法
credentialsMatcher.hashAlgorithmName=md5
#散列次数
credentialsMatcher.hashIterations=1

#将凭证匹配器设置到realm
customRealm=com.dpb.realm.MyRealm
customRealm.credentialsMatcher=$credentialsMatcher
securityManager.realms=$customRealm

测试

代码语言:javascript
复制
@Test
public void test() {
	// 1.获取SecurityManager工厂对象
	Factory<SecurityManager> factory = 
			new IniSecurityManagerFactory("classpath:shiro.ini");
	// 2.通过Factory对象获取SecurityManager对象
	SecurityManager securityManager = factory.getInstance();
	// 3.将SecurityManager对象添加到当前运行环境中
	SecurityUtils.setSecurityManager(securityManager);
	
	// 4.获取Subject对象
	Subject subject = SecurityUtils.getSubject();
	AuthenticationToken token = new UsernamePasswordToken("root", "123456");
	// 登录操作
	try {
		subject.login(token);
	} catch (UnknownAccountException e) {
		System.out.println("账号出错...");
	} catch(IncorrectCredentialsException e){
		System.out.println("密码出错...");
	}
	// 获取登录的状态
	System.out.println(subject.isAuthenticated());
}

迭代1次

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

迭代两次

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年01月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念
  • 加密分类
    • 对称加密
      • 非对称加密
      • 加密算法分类
        • 单向加密
          • 双向加密
          • 常见算法
          • MD5的使用
            • 盐值的作用
            • shiro中使用MD5加密
              • 认证方法中修改
                • ini.xml文件修改
                  • 测试
                    • 迭代1次
                    • 迭代两次
                相关产品与服务
                数据库
                云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档