HTTPS之对称加密与非对称加密(一)

tips: 首先要知道 HTTPS相对于HTTP 增长了机密性完整性身份认证不能否认等特性算法

先说说机密性。它是信息安全的基础

缺少机密性 TLS就会成为“无水之源”“无根之木”。实现机密性最经常使用的手段是“加密”(encrypt),就是把消息用某种方式转换成谁也看不懂的乱码,只有掌握特殊“钥匙”的人才能再转换出原始文本。安全

这里的“钥匙”就叫作“密钥”(key),加密前的消息叫“明文”(plain text/clear text),加密后的乱码叫“密文”(cipher text),使用密钥还原明文的过程叫“解密”(decrypt),是加密的反操做,加密解密的操做过程就是“加密算法”。session

全部的加密算法都是公开的,任何人均可以去分析研究,而算法使用的“密钥”则必须保密。那么,这个关键的“密钥”又是什么呢?性能

因为 HTTPS、TLS 都运行在计算机上,因此“密钥”就是一长串的数字,但约定俗成的度量单位是“位”(bit),而不是“字节”(byte)。好比,说密钥长度是 128,就是 16 字节的二进制串,密钥长度 1024,就是 128 字节的二进制串。优化

按照密钥的使用方式,加密能够分为两大类:对称加密非对称加密网站

对称加密

“对称加密”很好理解,就是指加密和解密时使用的密钥都是同一个,是“对称”的。只要保证了密钥的安全,那整个通讯过程就能够说具备了机密性。加密

举个例子,你想要登陆某网站,只要事先和它约定好使用一个对称密钥,通讯过程当中传输的全是用密钥加密后的密文,只有你和网站才能解密。黑客即便可以窃听,看到的也只是乱码,由于没有密钥没法解出明文,因此就实现了机密性。设计

TLS 里有很是多的对称加密算法可供选择,好比 RC四、DES、3DES、AES、ChaCha20 等,但前三种算法都被认为是不安全的,一般都禁止使用,目前经常使用的只有 AESChaCha203d

AES 的意思是“高级加密标准”(Advanced Encryption Standard),密钥长度能够是 12八、192 或 256。它是 DES 算法的替代者,安全强度很高,性能也很好,并且有的硬件还会作特殊优化,因此很是流行,是应用最普遍的对称加密算法。cdn

ChaCha20 是 Google 设计的另外一种加密算法,密钥长度固定为 256 位,纯软件运行性能要超过 AES,曾经在移动客户端上比较流行,但 ARMv8 以后也加入了 AES 硬件优化,因此如今再也不具备明显的优点,但仍然算得上是一个不错的算法。

加密分组模式

对称算法还有一个“分组模式”的概念,它可让算法用固定长度的密钥加密任意长度的明文,把小秘密(即密钥)转化为大秘密(即密文)。

最先有 ECB、CBC、CFB、OFB 等几种分组模式,但都陆续被发现有安全漏洞,因此如今基本都不怎么用了。最新的分组模式被称为 AEAD(Authenticated Encryption with Associated Data),在加密的同时增长了认证的功能,经常使用的是 GCM、CCM 和 Poly1305。

把上面这些组合起来,就能够获得 TLS 密码套件中定义的对称加密算法

好比,AES128-GCM,意思是密钥长度为 128 位的 AES 算法,使用的分组模式是 GCM;ChaCha20-Poly1305 的意思是 ChaCha20 算法,使用的分组模式是 Poly1305。

非对称加密

对称加密看上去好像完美地实现了机密性,但其中有一个很大的问题:如何把密钥安全地传递给对方,术语叫“密钥交换”。

由于在对称加密算法中只要持有密钥就能够解密。若是你和网站约定的密钥在传递途中被黑客窃取,那他就能够在以后随意解密收发的数据,通讯过程也就没有机密性可言了。

这个问题该怎么解决呢?

你或许会说:“把密钥再加密一下发过去就行了”,但传输“加密密钥的密钥”又成了新问题。这就像是“鸡生蛋、蛋生鸡”,能够无限递归下去。只用对称加密算法,是绝对没法解决密钥交换的问题的。

因此,就出现了非对称加密(也叫公钥加密算法)。

它有两个密钥,一个叫“公钥”(public key),一个叫“私钥”(private key)。两个密钥是不一样的,“不对称”,公钥能够公开给任何人使用,而私钥必须严格保密。

公钥和私钥有个特别的“单向”性,虽然均可以用来加密解密,但公钥加密后只能用私钥解密,反过来,私钥加密后也只能用公钥解密。

非对称加密能够解决“密钥交换”的问题。网站秘密保管私钥,在网上任意分发公钥,你想要登陆网站只要用公钥加密就好了,密文只能由私钥持有者才能解密。而黑客由于没有私钥,因此就没法破解密文。

非对称加密算法的设计要比对称算法可贵多,在 TLS 里只有不多的几种,好比 DH、DSA、RSA、ECC 等。

RSA 多是其中最著名的一个,几乎能够说是非对称加密的代名词

比起 RSA,ECC 在安全强度和性能上都有明显的优点。160 位的 ECC 至关于 1024 位的 RSA,而 224 位的 ECC 则至关于 2048 位的 RSA。由于密钥短,因此相应的计算量、消耗的内存和带宽也就少,加密解密的性能就上去了,对于如今的移动互联网很是有吸引力。

混合加密

看到这里,你是否是认为能够抛弃对称加密,只用非对称加密来实现机密性呢?

很遗憾,虽然非对称加密没有“密钥交换”的问题,但由于它们都是基于复杂的数学难题,运算速度很慢,即便是 ECC 也要比 AES 差上好几个数量级。若是仅用非对称加密,虽然保证了安全,但通讯速度有如乌龟、蜗牛,实用性就变成了零。

那么,是否是可以把对称加密和非对称加密结合起来呢,二者互相取长补短,即能高效地加密解密,又能安全地密钥交换。

这就是如今 TLS 里使用的混合加密方式,其实说穿了也很简单:

在通讯刚开始的时候使用非对称算法,好比 RSA、ECDHE,首先解决密钥交换的问题。

而后用随机数产生对称算法使用的“会话密钥”(session key),再用公钥加密。由于会话密钥很短,一般只有 16 字节或 32 字节,因此慢一点也无所谓。

对方拿到密文后用私钥解密,取出会话密钥。这样,双方就实现了对称密钥的安全交换,后续就再也不使用非对称加密,全都使用对称加密。

这样混合加密就解决了对称加密算法的密钥交换问题,并且安全和性能兼顾,完美地实现了机密性。

不过这只是第一步,后面还有完整性、身份认证、不能否认等特性没有实现,因此如今的通讯还不是绝对安全,咱们下次再说。

相关文章
相关标签/搜索