本文大多数内容来源于网络。
公钥与私钥
1.公钥与私钥原理
1)鲍勃有两把钥匙,一把是公钥,另一把是私钥
2)鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。
3)苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。
4)鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。
5)鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用Hash函数,生成信件的摘要(digest)。
6)然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature)。
7)鲍勃将这个签名,附在信件下面,一起发给苏珊。
8)苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。
9)苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。
10)复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成"数字签名",写信给苏珊,让苏珊用假的鲍勃公钥进行解密。
11)后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找"证书中心"(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。
12)鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。
13)苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的。
HTTP与HTTPS
什么是 HTTP 协议?
超文本传输协议。是基于TCP封装的一个协议,此协议默认是无状态的短连接,2.0之后支持长连接。
- 短连接:一次请求一次响应之后断开
- 数据传输格式:请求头与请求体之间通过 \r\n\r\n 分隔,请求头与请求头之间通过 \r\n 分隔
浏览器发送请求: http://www.baidu.com/index
socket.send("POST /index/ http1.1\r\nhost:www.baidu.com\r\n\r\nuser=aaa&status=1")
浏览器接收到的数据:
"200 OK\r\n响应头\r\n\r\n<html>...</html>"
默认端口 80;明文传输
HTTP协议的网站容易被篡改和劫持,如一些不良的运营商会通过代理服务器在你的页面中植入广告等。
因此很多网站选择使用HTTPS协议。
HTTPS 协议
HTTPS协议通过TLS层和证书机制提供了内容加密,身份认证,数据完整性三大功能。
TLS握手
客户端与服务器在通过TLS交换数据之前,必须协商建立加密信道。协商内容包括:TLS版本、加密套件,必要时还要验证证书。其每次协商,都需要在客户端和服务端往返,大致过程如下:
0 ms:TLS运行在TCP基础之上,这意味着我们必须首先完成TCP 三次握手“ ,这需要一个完整的来回交互(RTT)。
56 ms:TCP连接建立后,客户端发送一些协商信息,如TLS协议版本,支持的密码套件的列表,和其他TLS选项。
84 ms:服务器挑选TLS协议版本,在加密套件列表中挑选一个密码套件,附带自己的证书,并将响应返回给客户端。可选的,服务器也可以发送对客户端的证书认证请求和其他TLS扩展参数。
112 ms:假设双方协商好一个共同的TLS版本和加密算法,客户端使用服务器提供的证书,生成新的对称密钥,并用服务器的公钥进行加密,并告诉服务器切换到加密通信流程。到现在为止,所有被交换的数据都是以明文方式传输,除了对称密钥外,它采用的是服务器端的公钥加密。
140 ms:服务器用自己的私钥解密客户端发过来的对称密钥,并通过验证MAC检查消息的完整性,并返回给客户端一个加密的“Finished”的消息。
168 ms:客户端采用对称密钥解密消息,并验证MAC,如果一切OK,加密隧道就建立好了。客户端与服务器之前的应用程序数据就可以使用对称密钥加密之后进行发送。
数字证书
下面,我们看一个https中应用"数字证书"的实例:此例子中着重展示证书的校验
1)首先,客户端向服务器发出加密请求。
2)服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。
3)客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。
4)如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。
5)如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告
HTTPS 请求流程图
结合上面的 TLS 与证书加密,https 请求流程图为: