专栏首页波波烤鸭shiro教程3(加密)

shiro教程3(加密)

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

概念

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

加密分类

对称加密

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

非对称加密

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

加密算法分类

单向加密

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

双向加密

  通常分为对称性加密算法和非对称性加密算法,对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行 加解密了。非对称算法与之不同,发送双方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的使用

@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);
}

输出的结果:

e10adc3949ba59abbe56e057f20f883e
88316675d7882e3fdbe066000273842c
a7cf41c6537065fe724cc9980f8b5635

盐值的作用

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

shiro中使用MD5加密

认证方法中修改

@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文件修改

[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

测试

@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次

迭代两次

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Netty编解码之ProtoBuf案例二

      前面我们介绍了Protobuf的基本使用,但是我们是一个POJO对象创建一个proto文件,那么在实际环境中将要创建多个文件,会非常的不方便,本文我们来看看...

    用户4919348
  • SpringDataJPA之PagingAndSortingRepository接口

    PagingAndSortingRepository 接口继承于 CrudRepository 接口,拥有CrudRepository 接口的所有方法, 并新增...

    用户4919348
  • Vue教程(ref和$refs的使用)

      在Vue中一般很少会用到直接操作DOM,但不可避免有时候需要用到,这时我们可以通过ref和$refs这两个来实现,本文我们就来详细的介绍下这个内容

    用户4919348
  • 视频加密一机一码真相来了!线上教育“暑”你最安全!

    视频加密一机一码技术是对某些自有版权的视频进行加密处理,用户只有在一定的条件下才能获得视频的观看权。比如对于教育视频加密后,只有学员才能观看,每个学员都有自己的...

    点量小崔
  • 视频加密一机一码真相来了!线上教育“暑”你最安全!

    视频加密一机一码技术是对某些自有版权的视频进行加密处理,用户只有在一定的条件下才能获得视频的观看权。比如对于教育视频加密后,只有学员才能观看,每个学员都有自己的...

    点量小崔
  • Python与常见加密方式

    数据加密与解密通常是为了保证数据在传输过程中的安全性,自古以来就一直存在,古代主要应用在战争领域,战争中会有很多情报信息要传递,这些重要的信息都会经过加密,在发...

    润森
  • Spring Cloud内置加解密

    Spring Cloud内置了加解密的支持,包括对称加密和非对称加密。使用对称加密只需要在bootstrap.yml文件中通过encrypt.key属性指定加密...

    Java学习录
  • 某拍App算法so层逆向分析

    签名算法是指数字签名的算法。数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。数字...

    迅达集团
  • 破解之美:利用ECB加密缺陷突破cookie加密

    密码学诞生于古人类社会,例如古希腊斯巴达的密码棒、欧洲中世纪时期的密码栏、阿伯提发明的密码盘等。古代的密码学是一门加密隐蔽的学科,而现代密码学定义为加密与解密,...

    FB客服
  • 【Java小工匠聊密码学】--非对称加密--概述

      非对称加密算法需要两个密钥:[公开密钥] (publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,...

    Java小工匠

扫码关注云+社区

领取腾讯云代金券