标签:专题 加密 解密 算法 加密算法 密文 非对称 Shiro
目录
1.概念
加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容
数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为"密文",使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程。
2.加密分类
2.1.对称加密
在对称加密算法中,加密和解密使用的是同一把钥匙,即:使用相同的密匙对同一密码进行加密和解密;
加密过程如下:
加密:原文 + 密匙 = 密文
解密:密文 - 密匙 = 原文
例如:小明给小红发送微信消息表白,为了避免小红手机临时不在身边而导致消息被其他热看到,远原本小明计划发送”我爱你一生一世”,小明和小红使用一种约定好的暗语”5201314”来替代。当小红收到消息时,则自然明白文字的含义。
2.2.非对称加密
白了对称加密后,我们来了解一下什么是非对称加密。我们知道,对称加密是使用的
同一把密匙进行加密和解密。那么,非对称加密自然是使用不同的密钥进行加密和解密啦。
非对称加密有两个钥匙,及公钥(Public Key)和私钥(Private Key)。公钥和私钥是成对的存在,如果对原文使用公钥加密,则只能使用对应的私钥才能解密;因为加密和解密使用的不是同一把密钥,所以这种算法称之为非对称加密算法。
非对称加密算法的密匙是通过一系列算法获取到的一长串随机数,通常随机数的长度越长,加密信息越安全。通过私钥经过一系列算法是可以推导出公钥的,也就是说,公钥是基于私钥而存在的。但是无法通过公钥反向推倒出私钥,这个过程的单向的。
下面,让我们看一下非对称加密及解密过程。
根据上图,我们可以看到,对于原文,通过接收方的公钥进行加密,发送给接收方,接收方拿到密文后,通过自己的私钥可以解密,获取原文信息。在这个过程中,及时接收方公钥泄漏,也不会导致消息泄漏,因为密文只能通过接收方的私钥才能打开。所以,信息安全过程中,接收方只需要保管好自己的私钥不泄露即可。
同样,当接收方向发送方发送消息时,接收方将密文通过原发送方的公钥进行加密,原发送方通过自己的私钥才可解密。
到了这里,是不是感觉思维清晰了很多。了解了对称加密和非对称加密,那么,先来聊聊它们各自的优缺点吧。
2.3.对称加密和非对称加密小结
对称加密:
优点:算法简单,加密解密容易,效率高,执行快。
缺点:相对来说不算特别安全,只有一把钥匙,密文如果被拦截,且密钥也被劫持,那么,信息很容易被破译。
非对称加密:
优点:安全,即使密文被拦截、公钥被获取,但是无法获取到私钥,也就无法破译密文。作为接收方,务必要保管好自己的密钥。
缺点:加密算法及其复杂,安全性依赖算法与密钥,而且加密和解密效率很低。
3.加密算法分类
3.1.单向加密
单向加密是不可逆的,也就是只能加密,不能解密。通常用来传输类似用户名和密码,直接将加密后的数据提交到后台,因为后台不需要知道用户名和密码,可以直接将收到的加密后的数据存储到数据库
3.2.双向加密
通常分为对称性加密算法和非对称性加密算法,对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行 加解密了。非对称算法与之不同,发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消 息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理。
4.常见算法
算法 | 描述 |
---|---|
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),用于确保信息传输完整一致 |
5.MD5的使用
package com.bruce.test;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.junit.Test;
/**
* @BelongsProject: shiro2020
* @BelongsPackage: com.bruce.test
* @CreateTime: 2021-01-29 14:43
* @Description: TODO
*/
public class Md5Test {
@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
6.盐值的作用
使用MD5存在一个问题,相同的password生成的hash值是相同的,如果两个用户设置了相同的密码,那么数据库中会存储两个相同的值,这是极不安全的,加Salt可以在一定程度上解决这一问题,所谓的加Salt方法,就是加点‘佐料’。其基本想法是这样的,当用户首次提供密码时(通常是注册时)由系统自动往这个密码里撒一些‘佐料’,然后在散列,而当用户登录时,系统为用户提供的代码上撒上相同的‘佐料’,然后散列,再比较散列值,来确定密码是否正确。
加盐的原理:
给原文加入随机数生成新的MD5的值
7.shiro中使用MD5加密
认证方法中修改
/**
* 认证方法
* @param token
* 就是我们在测试代码中 定义的UsernamePasswordToken对象
* 有我们保存的需要验证的账号密码信息
*/
@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;
}
shiro.ini文件修改
[main]
#定义凭证匹配器
credentialsMatcher=org.apache.shiro.authc.credential.HashedCredentialsMatcher
#散列算法
credentialsMatcher.hashAlgorithmName=md5
#散列次数
credentialsMatcher.hashIterations=1
#将凭证匹配器设置到realm
customRealm=com.bruce.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次
迭代两次
标签:专题,加密,解密,算法,加密算法,密文,非对称,Shiro 来源: https://blog.csdn.net/BruceLiu_code/article/details/113386674
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。