加密
一.对称加密
特点:
加密和解密使用同一个秘钥
存在的问题
加密解密用同一个密钥,被黑客拦截知道密钥后安全丧失
二.非对称加密
特点:
加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密
公钥可以公开给别人进行加密,私钥永远在自己手里,非常安全,黑客拦截也没用,因为私钥未公开
存在的问题:
相比于对称加密,速度会比较慢一些
2.1 简单原理
公钥加密的数据无法使用公钥反推出来,例如
A告诉B,公钥是3233,17
假设B要传的数据是44
那么根据公式计算
B就把678这个数字传给A
上面说了,反着推是推不出来的
那A怎么解密呢?A自己还有一个密匙2753,用自己的密匙算一下就知道了
那为什么公钥加密的信息可以通过私钥解密?为什么公钥加密很难反推出来?这个我就不知道了,我对这方面也没什么兴趣,感兴趣的可以找一些大学公开课看看
2.2实际应用
此时还有一个问题,那就是
假如A与B进行通信,A持有私钥,B持有公钥
存在一个黑客C,可以截获到AB之间发送的任何信息
那么C就可以知道B所持有的公钥,从而知道A发送给B的任何信息
也就是B->A的信息他无法破解
但A->B的信息他都能知道
这样一来加密似乎没什么意义
那么在实际的生产生活中解决方法是,使用非对称传递对称加密密钥,然后使用对称加密传递消息
即
(1) A需要在银行的网站做一笔交易,他的浏览器首先生成了一个对称密钥
(2) A的浏览器向银行的服务器请求非对称加密公钥
(3) 银行系统自动生成一对非对称密钥,然后将其中的公钥发送给A
(4) A的浏览器使用银行发来的公钥将自己之前生成的对称密钥加密
(5) A的浏览器将加密后的对称密钥发送给银行
(6) 银行使用私钥解密得到A发来的对称密钥
(7) 之后,A与银行使用对称密钥进行通信
三.hash散列
根据key值和hash函数计算得到一个计算结果,我们希望能够达到的结果是
严格来说不算是加密
Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成特定长度且唯一的Hash值,但不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等
MD5
简介
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。
特点
1、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
2、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。(不可逆)
3、压缩性:任意长度的数据,算出的MD5值长度都是固定的128bit
4、容易计算:从原数据计算出MD5值很容易。
bcrypt
依赖
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
代码
public class BcryptTest {
public static void main(String[] args) {
//用户密码
String password = "123456";
//密码加密
BCryptPasswordEncoder passwordEncoder=new BCryptPasswordEncoder();
//加密
String newPassword = passwordEncoder.encode(password);
System.out.println("加密密码为:"+newPassword);
//对比这两个密码是否是同一个密码
boolean matches = passwordEncoder.matches(password, newPassword);
System.out.println("两个密码一致:"+matches);
}
}