不可逆
- 单向散列函数:MD5、SHA等
根据消息内容计算出散列值,散列值的长度和消息的长度无关,无论消息是1bit、10M、100G,单向散列函数都会计算出固定长度的散列值如下图所示常见的单向散列函数有MD4、MD5、SHA-1、SHA-2、SHA-3、SHA-256、SHA-384、SHA-512他们的区别就在于生产不同长度的散列值比如MD4、MD5生成的是128位的散列值SHA-1声场的160位的散列值
- 特点
- 不管明文内容多长都能计算出一个等长的的散列值
- 计算速度快能快速计算出散列值
- 明文不同散列值不同(哪怕明文只有一字节是不相同的整个散列值都非常不一样如下图)
- 单向性也就是不可逆
- 应用
- 防止数据篡改
例如一些官方软件一盘在官网下面生成一个散列值,如果相同的软件不在官网山下载的可以用同样的算法生成一个散列值比对一下就好 - 密码加密
一般作为后端开发的小伙伴用户的密码一般都不是直接存储到数据库的,要不然一旦数据库被攻破,会泄露大量的用户数据,所以就算数据库一般存储的也是加密后的密码,客户端将加密后的密码传给服务器,然后服务器比对加密后的散列值相同则说明登录成功
- 防止数据篡改
- 特点
可逆
对称加密:DES、3DES、AES等
对称加密其实就是加密的密钥和解密的密钥是同一个密钥,这种加密方式就是对称加密如下图所示:
常见对称加密:
- DES
DES是一个将 64bit的明文加密成 64bit密文的加密算法,密钥是 56bit。这里需要注意的是也有人说密钥是64位,但其实每个7位会有一个错误检查位,所以真实用到加密的应该是56位。
还有一点是应为DES是将64位明文转换成64位密文,所以如果数据量很大超过64位的时候就会反复是用加密算法吧所有的数据加密成密文。
这里有个注意点是,现在DES已经很容易被破解了,所以不建议使用 - 3DES
基于DES衍生出的一种算法,将DES重复3次所得到的一种密码算法又叫做三重DES。
这里需要注意的是所谓的重复三次加密并不是加密连续加密三次之后的结果而是加密->解密->加密的过程.如下图所示:
第一种方式是使用了三种不同的密钥另外一种方式就是使用两种密钥:
- AES
AES成为新标准的一种对称加密算法,又称Rijndael加密法.密钥长度是128、192、256位,是经过了全世界密码学家所进行的高品质验证工作。所以一般使用对称加密首选是AES
非对称加密:RSA等
非对称加密就是加密和解密使用的是不同的密钥如下图所示 在非对称加密中,密钥分为加密密钥、解密密钥2种,它们并不是同一个密钥.
加密密钥:一般是公开的,因此该密钥称为公钥,所以非对称加密也被称之为公钥加密
解密密钥:由消息接收者自己保管的,不能公开,因此也称为私钥
这里需要注意的是公钥和私钥是成对出现的,两个并成为密钥对,可以使用公钥加密私钥解密,也可以是用私钥加密公钥解密,生成密钥对的地方就是自己的电脑,比如你需要别人传输给你东西,你就需要生成一个密钥对,将公钥发出去。要给你发送消息的人就是用你发给他的公钥对消息加密,当你收到消息的时候再使用你自己的私钥解密(需要注意的是私钥是不在网络上传播的)
可能有人还是对这个密钥对有点迷糊,总结一下就是,谁需要接受消息,谁就要生成这个密钥对,应为发送的人需要使用你给的公钥加密消息,又应为私钥一直是在接受消息的人哪里,所以密钥配送是安全的如下图所示:
密钥配送问题
上文在说到对称加密的时候不知道大家有没有注意到,首先加密是需要密钥的,所以在发送消息的时候使用密钥加密了你还需要将你加密的密钥一并发送出去,应为接收方要知道怎么解密,所以测试如果还是有第三方冲中间将消息拦截,此时还是不安全的,应为是对称加密加密和解密都是一个密钥,所以第三方拿到了密钥即使传输的消息是个密文,也一样很容易的呗解开。所以在只使用对称加密的时候还是有漏洞.
上文说到了非对称加密,应为加密和解密不是两个不同的密钥,在网络上传输的仅仅是公钥,公钥只是用来加密的,并不能解密,而用于解密的私钥一直在用户自己这里,所以这样就很好解决了密钥配送的问题
其他
混合密码系统
上文说到的对称加密和非对称加密他们所拥有的特点有:
- 对称加密:相对于非对称加密效率高速度快,但是密钥配送会有问题(有被窃听的风险)
- 非对称加密:相对于对称加密来说效率不高且速度很慢,但是能解决掉密钥配送的问题
基于两个的优缺点也就衍生出了混合密码系统,网络上的密码通信所用的SSL/TLS都运用了混合密码系统
混合密码系统一共会用到三种密钥:
- 会话密钥:就是消息的传输使用的还是对称加密这个会话密钥就是对称加密的密钥
- 公钥和私钥:公钥私钥的作用就是加密会话密钥使用的
加密过程
首先需要确定的是此时消息的传播就包含了两块消息,一个是会话密钥、还一个是消息体,应为对称加密是效率高的所以消息体还是使用对称加密的方式。但是会话密钥如果明文传输那就是个单纯的对称加密,有风险,所以此时会话密钥的传输就是用非对称加密进行加密传输。具体步骤如下:
- 首先消息发送者需要收到消息接受者的公钥
- 生成会话密钥,也就是对称加密的密钥
- 使用会话密钥加密消息,使用消息接受者的公钥加密会话密钥
- 将加密后的两者一并发送给消息接受者
如下图所示:
解密过程
- 消息接受者首先需要使用自己的私钥解密会话密钥
- 拿到会话密钥之后再使用会话密钥解密消息
如下图所示:
数字签名
虽然非对称加密解决了密钥传输的问题,但是,消息的内容还是有可能被截获然后被修改如下图: 所以此时为了消息安全的传输就需要验证消息的完整性和真实性,也就出现了数字签名. (同时数字签名还可以防止消息发送者否认是自己发送的消息) 数字签名的原理就是消息发送者使用自己的私钥将消息加密,然后接受者使用公钥解密,具体过程如下图:
但是这样做消息的传输速度会变慢应为使用了非对称加密,进一步改进方案是,消息发送者发送两块消息给消息接受者,一个是通过单项散列函数将消息体生成一串固定的值(也就将消息体缩小了)然后将这个散列值加密,再合并消息发送给消息接受者,消息接受者收到消息的时候先将这个散列值解密然后将消息体通过相同的单项散列函数生成一个散列值,然后再对比两个散列值是否相同如果相同则证明消息是安全的,具体流程如下:
证书
应为公钥是在网络上传输的所以公钥也有可能被篡改如下图场景所示: 所以此时就需要验证公钥的合法性,此时就有了公钥证书: 里面有姓名、邮箱等个人信息,以及此人的公钥并由认证机构(CA)施加数字签名( CA就是能够认定“公钥确实属于此人”并能够生成数字签名的个人或者组织)。
所以一般自己生成的密钥对都现需要将公钥上传到认证机构
具体证书的使用流程如下: 各大CA的公钥,默认已经内置在浏览器和操作系统中
证书的注册和下载流程如下: