一 秘钥
秘钥(key)通过加密算法(key algorithms)生成。加密算法分为两类:对称秘钥加密算法(symmetric key algorithms)和非对称秘钥加密算法(asymmetric key algorithms)。前者属于单钥加密(private key cryptography),只产生一把秘钥,由该秘钥加密和解密,拥有秘钥的双方都需要保管好秘钥,因此秘钥容易被泄漏出去;而后者属于双钥加密(public key cryptography),产生两把秘钥,一把公开的公钥(public key),一把不公开的私钥(private key),只需要保管好私钥,安全性大大提高了 。
在双钥加密的情况下
- 公钥和私钥一一对应,有一把公钥就必然有一把与之对应的、独一无二的私钥,反之亦成立。
- 所有的(公钥, 私钥)对都是不同的。
- 公钥可以解开私钥加密的信息,反之亦然;但不能解开自己加密的信息。公钥一般用于加密,私钥一般用于解密。
- 秘钥对生成后,不能从公钥推出私钥,在原理上也不能从私钥推出公钥,但是由于一般私钥中也会保存公钥的信息,因此可行,如
ssh-keygen -y
目前,通用的单钥加密算法为DES
(Data Encryption Standard),通用的双钥加密算法为RSA
( Rivest-Shamir-Adleman),都产生于上个世纪70年代。单钥加密算法还有AES
(微信公众号正在使用),双钥加密算法还有dsa
,ecdsa,ed25519
等。
二 数字证书
浏览器与服务器使用https
通信时,通信过程如下(这里的步骤2是错误的):
- 浏览器向服务器发出请求。
- 服务器发送公钥给浏览器,之后双方都通过秘钥对数据加密和解密。
- 服务器将浏览器请求的数据通过哈希函数,产生摘要(digest),然后用私钥对摘要进行加密,产生数字签名(signature),并将数据连同数字签名发给浏览器。常用的生成摘要的算法如
md5
,参考:零碎知识4.6小节 - 浏览器使用公钥解密数字签名,得到摘要,然后也对数据进行哈希运行产生摘要,将两者对比,判断是否来自于要访问的服务器,然后执行自己的操作。
- 两者继续通过秘钥通信
但是问题来了,步骤1、2中,浏览器请求服务器时,请求被hacker拦截,并模拟服务器发送自己的公钥给浏览器,于是hacker可以通过自己的私钥来骗取浏览器的信任,容易窃取到浏览器用户的信息。这就是著名的中间人攻击。
也就是说,浏览器获得的公钥不可信。为了解决此问题,引入了大家都信任的数字证书认证机构(CA) ,CA用自己的秘钥将服务器一些相关信息和公钥加密起来形成数字证书。于是步骤2中,服务器不再发送公钥给浏览器,而是发送数字证书。浏览器一般会保存被信任的所有认证机构(CA)的公钥,用于解密收到的数字证书,得到服务器的公钥,再进行步骤4进行验证。
只要CA的私钥不被泄漏,hacker就不能伪造数字证书,从而不能将自己的公钥传给浏览器。即使hacker获取了其他服务器的私钥和数字证书,拦截浏览器请求交给它该数字证书,浏览器也判断该证书代表的服务器不是自己访问的,因为数字证书中还含有与服务器相关的信息。
这就是https能够保证数据安全的原因。