非对称加密之PKI体系
加密算法简述
所谓加密算法就是指将信息变成密文的计算方法。 可以很简单也可以很复杂。有的加密算法就是对信息进行简单的替换和乱序, 这种加密算法最明显的缺陷就是算法本身必须保证是保密的。
现代加密算法通常需要密匙来完成对信息的加密运算, 算法本身是可以公开的,只要保证密匙的安全就能保存信息的安全。
基于密匙的加密算法可以分为两大类:
- 对称加密算法:
加密数据和解密数据都是用的同一个密匙。缺点是密钥不安全。如AES - 非对称加密算法:
密匙分为公钥和私钥,公钥大多数情况下用来加密数据, 私钥大多数情况下用来解密数据; 不能从公钥推导出私钥; 任何人都可以拥有公钥,都可以用来加密数据, 只有拥有私钥的人才能将信息解密。安全,但是速度比对称加密慢.
PKI 公开密匙体
相关概念
- PKI:Public Key Infrastructure,公钥基础设施。不是协议,只是一个比较泛的体系基础概念.
- CA:Certificate Of Authority,认证中心。
- RSA: 当今使用最为广泛的非对称加密算法。
- 数字证书:提供了一种发布公钥的简便途径;
- 一个数字证书包括:拥有者身份信息、公钥、CA数字签名、有效期等其他信息。
- 数字签名:用来确认信息发送者的身份,保证信息的完整性和抗否认性。
RSA 非对称加密解密理论基础
只能说打个比方, 如果加密就是将信息放入锁盒, 解密就是用钥匙打开。
- 公钥是公开的锁盒,谁都买得到相同的,看得到,摸得到. 大家发送消息就是把消息装进锁盒(加密),送出去.
- 私钥是私藏的钥匙,每一个锁盒只有对应的私钥才能打开锁盒,拿到里面的信息.
注: 实际使用中没有规定公钥必须加密,因为原理上也允许公钥加密,私钥加密。 公钥私钥在加密体系中并无区别,只是能被公开访问的是公钥, 私密持有的是私钥
但是具体实现原理,我数学不好,建议看阮一峰的博文
- 数学基础知识: RSA算法原理(一
- 加密解密过程: RSA算法原理(二)
签名与数字证书的区别
- 加密,是指对某个内容加密,加密后的内容还可以通过解密进行还原。
- 签名,是在信息的后面再加上一段内容,可以证明信息没有被修改过。一般是根据信息计算得到一个hash值(即为
数字摘要
)。信息解密后,通过新hash需要和原hash是否一致判断信息是否修改。 - 数字证书,由受信任的CA颁布, 在网上公开,包含签名(防止被篡改), 内含有公钥, 用于证明该公钥的确是该单位的。
Tradeoff
非对称加密速递慢不适合用于大量的数据加密传输。 为了实现数据的加密传输, 非对称加密需要和对称加密结合使用, 即
- 非对称负责对称密匙交换,也叫
对话密钥(session key)
=> 提高安全性 - 对称加密算法负责实际的数据加密 => 提高传输效率
接下来就要讨论各种主流的通信协议
SSH
常用于服务器通信,只涉及客户端和服务端. 有一个服务器在互联网的另一头,你需要远程登录到服务器来执行一些命令配置这台服务器。这个时候你和服务器之间就需要有数据通信。假设客户端叫A,服务器叫B。
流程:
- A、B之间建立TCP连接
- B生成一对公私密钥
- B把公钥发送给A
- A生成一个用于加密数据的对称密钥K(既我们想通知给客户端的密钥,之后的数据通信都使用这个密钥加密,这个密钥不可让第三方知道)
- A把K用公钥加密发送给B,B解密后,从此A、B之间的通信数据都用K密钥进行加密和解密。
看上去是完美无瑕的,但是设计时候要考虑任何信息被掉包的情况,比如B被黑客C劫持, 发过来的公钥其实是C的,之后A发送的消息也被C截获,那么K就泄露给了C, 就GG了.
所以我们在登陆SSH的时候,通常会看到人工确认信息
1 | The authenticity of host 'xxx.xxx.xxx.xxx (<no hostip for proxy command>)' can't be established. |
这是希望客户端A人为去验证一下登陆的服务器是不是B。显然这种方法只适合对服务器熟悉的场合才能使用,而且需要额外确认, 在广大大众上网时候,许多网站都是陌生的,所以这个方法就存留在了程序员的远程登陆
TLS/SSL(Secure Sockets Layer)
SSL和TLS基本一致,就一起讲。
在SSL协议中引入了一种类似公共机关(类似于我国的国家公证处)的概念,就是我们熟知的CA(数字证书认证机构),为站点发送数字证书, 来证明服务器可信.
其大致流程相比于SSH,其实多了一步提前验证服务器。整体可以看成四个阶段
单向与双向
具体地, 根据对客户端的验证成都, 又可以分为单向和双向.
- 单向SSL
第3步需要服务端的CA数字证书验证服务端
- 双向SSL
第3步需要CA的数字证书验证服务端, 第5步验证客户端
- 场景对比
- SSL单向认证只要求站点部署了SSL证书就行,任何用户都可以去访问(IP被限制除外) 一般web应用都是单向的
- SSL双向认证则是需要服务端与客户端提供身份认证,只能是服务端允许的客户去访问,安全性相对高一些。常用于内网权限限制, 企业应用对接等.
HTTPS
= HTTP+ SSL
所以会导致原本就慢的握手阶段,更加慢.