1. 为什么需要数据加密?
数据加密,就是加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。它的核心是密码学。
数据加密是计算机系统对信息进行保护的一种最可靠的办法。它利用密码技术对信息进行加密,实现信息隐蔽,从而起到保护信息安全的作用。
最典型的应用场景就是数据网络传输和数据存储,为了避免敏感信息泄露,我们就会用到加密算法。
2. 加密算法分类
加密算法可以分三类:对称加密算法、非对称加密算法、哈希算法(散列算法)。
- 对称加密算法的作用是加密和解密,通信双方事先约定好密钥,使用同一个密钥进行明文加密和密文解密。优点是速度快,缺点是不够安全。
- 非对称加密算法的作用是安全约定密钥(对称加密密钥),服务端保留私钥公开公钥,客户端使用公钥加密密钥明文发送给服务端,服务端用私钥解密获得密钥明文。优点是安全,缺点是速度慢。
- 哈希算法在加密领域的作用是生成信息摘要,用来验证信息的完整性和正确性。
对称加密算法速度快,但是约定密钥时不够安全,容易被拦截,所以出现了非对称加密算法,可以安全地约定密钥。
详情参考漫画:什么是加密算法?
3. HTTPS(SSL/TLS)加密原理
3.1. 基础概念
3.1.1. HTTPS
超文本传输安全协议(英语:HyperText Transfer Protocol Secure,缩写:HTTPS;常称为HTTP over TLS、HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换资料的隐私与完整性。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上。
参考文档:维基百科 - 超文本传输安全协议
3.1.2. TLS
传输层安全性协议(英语:Transport Layer Security,缩写:TLS)及其前身安全套接层(英语:Secure Sockets Layer,缩写:SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。
SSL包含记录层(Record Layer)和传输层,记录层协议确定传输层数据的封装格式。传输层安全协议使用X.509认证,之后利用非对称加密演算来对通信方做身份认证,之后交换对称密钥作为会谈密钥(Session key)。这个会谈密钥是用来将通信两方交换的数据做加密,保证两个应用间通信的保密性和可靠性,使客户与服务器应用之间的通信不被攻击者窃听。
参考文档:维基百科 - 传输层安全性协议
3.1.3. PKI
公开密钥基础建设(英语:Public Key Infrastructure,缩写:PKI),又称公开密钥基础架构、公钥基础建设、公钥基础设施、公开密码匙基础建设或公钥基础架构,是一组由硬件、软件、参与者、管理政策与流程组成的基础架构,其目的在于创造、管理、分配、使用、存储以及撤销数字证书。
密码学上,公开密钥基础建设借着数字证书认证机构(CA)将用户的个人身份跟公开密钥链接在一起。对每个证书中心用户的身份必须是唯一的。链接关系通过注册和发布过程创建,取决于担保级别,链接关系可能由CA的各种软件或在人为监督下完成。PKI的确定链接关系的这一角色称为注册管理中心(Registration Authority,RA)。RA确保公开密钥和个人身份链接,可以防欺诈。在微软的公开密钥基础建设之下,注册管理中心(RA)又被叫做从属数字证书认证机构(Subordinate CA)。
参考文档:维基百科-公开密钥基础架构
3.1.4. CA
数字证书认证机构(英语:Certificate Authority,缩写为CA),也称为电子商务认证中心、电子商务认证授权机构,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
参考文档:维基百科-证书颁发机构
3.1.5. 数字证书
公钥证书(英语:Public key certificate),又称数字证书(digital certificate)或身份证书(identity certificate)。是用于公开密钥基础建设的电子文件,用来证明公开密钥拥有者的身份。此文件包含了公钥信息、拥有者身份信息(主体)、以及数字证书认证机构(发行者)对这份文件的数字签名,以保证这个文件的整体内容正确无误。拥有者凭着此文件,可向电脑系统或其他用户表明身份,从而对方获得信任并授权访问或使用某些敏感的电脑服务。电脑系统或其他用户可以透过一定的程序核实证书上的内容,包括证书有否过期、数字签名是否有效,如果你信任签发的机构,就可以信任证书上的密钥,凭公钥加密与拥有者进行可靠的通信。
公钥证书包括自签证书、根证书、中介证书、授权证书、终端实体证书(TLS服务器证书和TLS客户端证书)。
参考文档:维基百科-公钥证书
3.2. HTTPS(SSL/TLS)加密原理
TLS/SSL 的功能实现主要依赖于三类基本算法:散列函数 Hash、对称加密和非对称加密。其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。
TLS 的基本工作方式是,客户端使用非对称加密与服务器进行通信,实现身份验证并协商对称加密使用的密钥,然后对称加密算法采用协商密钥对信息以及信息摘要进行加密通信,不同的节点之间采用的对称密钥不同,从而可以保证信息只能通信双方获取。
例如,在 HTTPS 协议中,客户端发出请求,服务端会将公钥发给客户端,客户端验证过后生成一个密钥再用公钥加密后发送给服务端(非对称加密),双方会在 TLS 握手过程中生成一个协商密钥(对称密钥),成功后建立加密连接。通信过程中客户端将请求数据用协商密钥加密后发送,服务端也用协商密钥解密,响应也用相同的协商密钥。后续的通信使用对称加密是因为对称加解密快,而握手过程中非对称加密可以保证加密的有效性,但是过程复杂,计算量相对来说也大。
HTTPS通信原理:
对称加密:HTTPS 的最终加密形式。
非对称加密:解决单向对称密钥的传输问题。
数字证书:解决公钥传输信任问题。
HTTPS的最终加密形式是对称加密,因为对称加密速度快。但是对称加密需要双方约定好一个密钥,这里就存在一个问题,就是这个密钥在传输过程中有可能会被别人窃取。
对于这个问题,HTTPS中的解决办法是使用非对称加密,就是使用一个密钥对,公钥公开,私钥保密。公钥加密的内容只有私钥才能解密,私钥签名的内容只有公钥才能验签。server把公钥发送给client,client使用公钥加密对称加密的密钥,然后发送给server,server使用私钥进行解密获取到对称密钥。因为私钥只有server有,所以client向server的传输是安全的。但是这里又有一个问题,server把公钥传送给client的过程怎么保证安全?怎么保证返回请求的server是真正的server?
对于这个问题,HTTPS中的解决办法是使用数字证书。数字证书就是权威第三方机构(CA)出具的证明,经过这个机构认证的证书是可靠的证书。那这个数字证书怎样申请和使用呢?
1、首先server也就是域名所有者会向CA申请SSL证书,申请的时候会使用dns解析等方法验证,保证只有域名所有者才能申请到证书明文和CA私钥签名(证书签名),证书中包含公钥。
2、client和server在进行通信时,client从server获取到了域名的证书明文和CA私钥签名。
3、client根据摘要算法对证书明文生成证书摘要;同时使用内置在操作系统中的CA公钥对CA私钥签名进行验签获取证书摘要。如果两份证书摘要是一致的,域名也和证书上对的上,说明server是可信的,那我们从证书中获取到的公钥也就是可信的。
4、client使用公钥加密对称加密的密钥,发送给server,server使用私钥进行解密获取到对称密钥,然后双方就可以进行安全通信了。
如果黑客拿到了server的证书和证书签名,是不是可以冒充server?不可以,因为没有私钥,无法解密client通过公钥加密的内容。
参考文档:
3.3. HTTPS配置实践
- 网站配置HTTPS加密访问:《好好学Hexo:Hexo启用HTTPS加密连接》
- 自建CA并颁发证书:《好好学Linux:Linux中安装使用mkcert签发域名证书》
- K8S中的数字证书:《好好学K8S:K8S中创建用户账户和服务账户》
4. 信封加密原理
信封加密就是用一个密钥加密明文数据,然后用另一个密钥加密这个密钥。
比如战争时期,Alice和Bob要就军事行动进行沟通。他们已经提前在线下碰过头,约定了一个共享的对称密钥S。某天,Alice想发电报给Bob,通知内容C具体为老大决定今晚11点动手。
正常的加密思路是:Alice用对称密钥S加密通知内容C,然后将密文发送给Bob。Bob在收到密文消息之后,用对应密钥S解密得到通知内容C。 这样就知道行动内容了。但是,这样做会有什么问题吗?
当然有。假设Alice它们按照计划行动了,那以后但凡Alice和Bob之间的通知内容是老大决定今晚11点动手,敌方就得会知晓,因为密文是保持不变的。那怎么解决这个问题呢?
Alice首先临时生成一个对称密钥R,并用该对称密钥R加密通知内容C,然后将密文发送给Bob。但问题是,Bob在收到密文消息之后,它该如何解密呢?Bob的手上只有之前约定的对称密钥S,并没有Alice临时生成的对称密钥R,因此Bob无法解密。
聪明的Alice也想到了这个问题。因此,Alice使用对称密钥S对密钥R做了个加密,并将加密的结果同时发给了Bob。这样,Bob在收到消息之后,首先用对称密钥S解密出临时的对称密钥R,然后用R解密出通知内容C。
如果Alice和Bob再次传输相同的内容C,因为使用的临时对称密钥R是不同的,因此加密后的C也是不同的,即便加密前的明文C还是同一个。
在这个场景中,对称密钥R实际上就是一个会话密钥,对称密钥S就是一个主密钥。因为对称密钥R每次都不一样,但是对称密钥S是一直被重复使用的。
参考文档: