作者:David Youd
翻译:阮一峰
其他:
如何保证公钥不被篡改?
答:将公钥放在数字证书中,只要证书是可信的,公钥就是可信的。
公钥加密计算量太大,如何减少耗用时间?
答:每一次对话(session),客户端和服务器都生成一个对话密钥(session key),用它来加密信息,由于“对话密钥”是对称加密,所以运算速度非常快,而服务器公钥只用于加密“对话密钥”本身,这样就减少了加密运算的消耗时间。
因此SSL/TLS协议的基本过程是:
1)客户端向服务器索要并验证公钥(握手阶段,明文)
2)双方协商生成“对话密钥”(握手阶段,明文)
3)双方采用“对话密钥”进行加密通信
握手阶段详解:
1)客户端发出请求(ClientHello) 并提供如下信息
a 支持的协议版本,例如TLS 1.0
b 客户端生成的随机数,用于生成“对话密钥”
c 支持的加密方法,例如RSA公钥加密
c 支持的压缩方法
2)服务器回应(SeverHello)
a 确认使用的加密通信协议版本,如果客户端与服务器支持版本不一致,服务器关闭加密通信
b 服务器生成的随机数,用于生成“对话密钥”
c 确认使用的加密方法
d 服务器证书
3)客户端回应
客户端验证服务器证书,若证书问题,显示警告是否继续通信。
若证书安全,客户端从证书中提取公钥,向服务器发送如下信息:
a 随机数(用公钥加密,防止窃听)【第三个随机数,又称"pre-master key",三个随机数+加密方法 生成session key】
b 编码改变通知,表示随后的信息都将用双方协商的加密方法和密钥传输
c 客户端握手结束通知,表示客户端的握手阶段结束,同时包括hash值,供服务器校验
4)服务器回应
服务器生成 session key ,并发送如下信息:
a 编码改变通知,随后的信息都将使用双方协商的加密方法和密钥传输
b 服务器握手结束通知,表示服务器的握手阶段结束,同时包括hash值,供客户端校验
//
1、鲍勃有两把钥匙:公钥和私钥
2、鲍勃把公钥送给朋友们:帕蒂、道格、苏珊,每人一把
3、苏珊要给鲍勃写一封保密信件,她写完后用鲍勃的公钥加密,就可以达到保密的效果
4、鲍勃收到邮件后,用私钥解密,就可以看到邮件的内容。
(注意:只要鲍勃的私钥不泄露,这份邮件就是安全的,即使落在别人手里,也无法解密)
5、鲍勃给苏珊回信,决定采用“数字签名”,他写完后先用Hash函数,生成信件的摘要(Digest)
6、然后,鲍勃使用私钥,对这个摘要进行加密,生成“数字证书”(signature)
7、鲍勃将这个签名,附在信件下面,一起发送给苏珊
8、苏珊收件后,取下数字证书,使用鲍勃的公钥解密,得到邮件的摘要,由此证明,这封信确实是鲍勃发出的。
9、苏珊再对信件本身使用Hash函数,将得到的结果与上一步得到的摘要进行对比,如果两者一致,说明邮件未被修改过
10、复杂情况:道格想欺骗苏珊,他偷偷使用苏珊的电脑,用自己的公钥替换鲍勃的私钥。
此时,苏珊实际拥有的是道格的公钥。
因此,道格可以冒充鲍勃,用自己的私钥做成“数字证书”,写信给苏珊,让苏珊用假的鲍勃的公钥进行解密。
11、后来苏珊发觉不对劲,发现自己无法确定公钥是否属于鲍勃。
她想到一个办法:要求鲍勃去找“证书中心”(certificate authority,简称CA),为公钥做认证。
证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成数字证书(Digital Certificate)。
12、鲍勃拿到数字证书后,就可以放心给苏珊写信了,只要在签名的同时,附上数字证书即可。
13、苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃的真实公钥,以此判断数字证书是否鲍勃的。
14、以HTTPS协议为例,了解数字证书的应用,主要用于web加密
15、首先,客户端向服务器发出加密请求。
16、服务器用自己的私钥加密网页后,连同本身的数字证书,一起发送给客户端
17、客户端的证书管理器,有“受信任的根证书颁发机构”列表。
客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。
18、如果数字证书记载的网址,与当前浏览的网址不一致,就说明该证书可能被毛用,浏览器发出警告。
19、如果这张证书不是由受信任的机构颁发的,浏览器就会发出另一种警告。
20
总结:公钥和私钥是成对的,它们互相解密。
公钥加密,私钥解密。
私钥数字签名,公钥验证。