为啥需要Https
在https之前,http的所有请求都是明文传输的,如果信息在传输过程中被劫持,传输信息将完全被暴露,甚至劫持者可对信息进行篡改,所以比较安全的方法就是对传输加密。常见的加密方法分为对称加密、非对称加密。
加密方法
对称加密
对称加密指的是加密和解密使用同一个密钥。
但是在安全通信之前,客户端和服务端是不会有这样同一把密钥的。需要其中一方将密钥发送给对方。
在整个传输过程没有任何验证操作,所以黑客也可以劫取到这把密钥从而破译出加密的内容。
所以纯对称加密是不安全的
非对称加密
非对称加密需要两个密钥来进行加密和解密,这两个密钥是公钥和私钥。
公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密
【bug】服务端拥有公钥与私钥,服务端将公钥传给客户端,客户端可通过此公钥进行解析数据;但是同时该公钥也可能会被劫持,由服务端传给客户端的数据将会被劫持者获得。。。
所以单用非对称加密传输信息也是不可靠的。
Https传输密钥的过程
- 客户端向服务端发起连接请求;
- 服务端将CA证书发送给客户端;
- 客户端验证CA证书,并获取取服务端非对称加密的公钥,然后生成对称加密的密钥, 并使用服务端非对称加密的公钥进行加密,将加密之后的信息发送给服务端;
- 服务端接受之后,通过服务端的私钥解密获得对称加密的密钥; 在之后的数据传输过程中将使用该密钥进行对称加密;
疑问
- 服务端只是将CA证书传给了客户端,客户端怎么就获取了服务端非对称加密的公钥了呢?
数字证书里包含
- 版本号:标识证书的版本(版本1、版本2或者是版本3)
- 序列号:标识证书的唯一整数 ....
主体:证书拥有者的可识别名主体公钥信息:主体的公钥(以及算法标识符)- 证书签名算法
- 数字签名 好吧,服务端非对称加密的公钥包含在了数字证书里了
- 数字证书会被篡改吗? 数字证书是由CA认证机构颁发的,其中数字证书中包含的数字签名,其中数字签名是验证证书是否被篡改的关键。
数字签名的生成过程:
- CA机构拥有非对称加密的私钥和公钥;
- CA机构对证书明文数据T进行hash;
- 对hash后的值用私钥加密,得到数字签名S;
客户端验证过程:
- 客户端拿到证书,得到明文T,签名S;
- 用CA机构的公钥对S解密,得到S’;
- 用证书里指明的hash算法对明文T进行hash得到T’;
- T’ === S’,则表明证书可信;
但是如果CA机构将私钥泄露了,那就。。。
-
每次进行Https请求,都会进行密钥传输吗? 不会,服务端会为每个客户端维护一个session ID,在TLS握手阶段传给客户端,客户端生成好密钥传给服务端后,服务端将该密钥存到相应的session ID下,之后客户端每次请求都会携带session ID,服务端会根据session ID找到相应的密钥并进行解密加密操作,这样就不必要每次重新制作、传输密钥了。
-
为什么不全过程采用非对称加密的方式传输数据,而是采用非对称加密与对称加密结合的方式? 非对称加密算法的数学原理是大素数的分解,计算量大,耗时