对称加密
对称加密就是用同一个密钥把明文进行加密变成密文,也能把密文解密为明文.
理想状态下:
引入对称加密之后, 即使数据被截获, 由于黑客不知道密钥是啥, 因此就无法进行解密, 也就不知道请求的真实内容是啥了.
但同一时刻服务器服务的客户端有很多,这么多客户端, 每个人用的秘钥都必须是不同的(如果相同的话黑客破解一个key,其他客户端的也就全部知道了,安全系数不高),所以服务器需要维护每个客户端与其密钥之间的联系.
比较类型的做法是:
客户端与服务器建立连接的同时能够进行协定密钥是什么
但对密钥的传输也是明文,黑客能够轻松拿到,形同虚设.
此时就需要引入非对称加密.
非对称加密
非对称加密要用到两个密钥, 一个叫做 “公钥”, 一个叫做 “私钥”.
公钥的由来始于密码学的发展。在传统密码学中,采用的是对称密钥加密方式,即加密和解密使用同一把密钥。但由于对称密钥加密存在密钥分发等问题,人们提出了“公钥密码学”概念,其中最重要的是RSA算法。
RSA算法的核心思想是利用大数分解的困难性实现公钥及私钥之间的转换。具体地说,RSA算法利用两个大质数p和q的乘积N作为模数,选择一个整数e作为公钥,使得e与(p-1)(q-1)互质,然后利用扩展欧几里得算法求出d,使得d*e ≡ 1 mod (p-1)(q-1),d即为私钥。这样,任何人都可以得到公钥(e,N),但只有持有私钥d的人才能解密密文。
公钥和私钥是配对的. 最大的缺点就是运算速度非常慢,比对称加密要慢很多,因此非对称密钥一般用来保证对称密钥的安全传输.
公钥用来加密
私钥用来解密
当然也可反着来
私钥用来加密
公钥用来解密
- 客户端在本地生成对称密钥通过公钥进行加密传输给服务器.
- 即使黑客截取到了密文,也因为没有私钥而无法获取信息.
- 服务器接收到密文后用私钥进行解密,获取到对称密钥.
- 后续传输只需要使用使用对称密钥进行加密即可.
那么客户端是如何拿到公钥的,如何确定公钥是不是黑客伪造的呢?
如下情况:
- 黑客通过一招偷梁换柱即可在服务器与客户毫不知情的情况下获取后续传续所用的密钥,这种情况下加密传输对黑客来说依旧是明文传输.
这种情况就需要引入证书了.
证书的引入
在客户端和服务器刚一建立连接的时候, 服务器给客户端返回一个 证书.
这个证书包含了刚才的公钥, 也包含了网站的身份信息.
证书都是由 CA(Certificate Authority)机构来颁发.
证书的类型
1、SSL证书,用于加密HTTP协议,也就是HTTPS。
2、代码签名证书,用于签名二进制文件,比如Windows内核驱动,Firefox插件,Java代码签名等等。
3、客户端证书,用于加密邮件。
4、双因素证书,网银专业版使用的USB Key里面用的就是这种类型的证书。
证书中包含了以下信息:
证书发布机构
证书有效期
公钥
证书所有者
签名
等待
当客户端获取到这个证书之后, 会对证书进行校验(防止证书是伪造的).
- 判定证书的有效期是否过期
- 判定证书的发布机构是否受信任(操作系统中已内置的受信任的证书发布机构).
- 验证证书是否被篡改: 从系统中拿到该证书发布机构的公钥, 对签名解密, 得到一个 hash 值(称为数据摘要), 称为 hash1. 然后计算整个证书的 hash 值, 称为 hash2. 对比 hash1 和 hash2 是否相等.如果相等, 则说明证书是没有被篡改过的.
下面通过一个完整的流程来演示引入证书后的加密流程:
整个流程总结为三部分:
- 校验证书是否被篡改.服务器持有在注册证书时获得的私钥1,客户端持有公钥1((操作系统包含了可信任的 CA 认证机构有哪些, 同时持有对应的公钥),服务器使用私钥对证书进行加密传输,客户端获取证书后,进行解密验证证书是否有没有被修改过.
- 生成对称加密的密钥. 服务器生成私钥2,公钥2,将公钥2放入证书中,加密传输给客户端,客户端通过公钥1解密后获取公钥2,并生成对称密钥key,通过公钥2加密,传输到服务器,服务器通过私钥2解密获取对称密钥key.
- 后续客户端与服务器的数据传输都是通过对称密钥进行加密解密传输.