详解版 深入浅出 HTTPS( 二 )


非对称加密可以解决“密钥交换”的问题 。网站秘密保管私钥,在网上任意分发公钥,你想要登录网站只要用公钥加密就行了,密文只能由私钥持有者才能解密 。而黑客因为没有私钥,所以就无法破解密文 。
非对称加密算法的设计要比对称算法难得多,在 TLS 里只有很少的几种,比如 DH、DSA、RSA、ECC 等 。

  • RSA 可能是其中最著名的一个,几乎可以说是非对称加密的代名词,它的安全性基于“整数分解”的数学难题,使用两个超大素数的乘积作为生成密钥的材料,想要从公钥推算出私钥是非常困难的 。10 年前 RSA 密钥的推荐长度是 1024,但随着计算机运算能力的提高,现在 1024 已经不安全,普遍认为至少要 2048 位 。
  • ECC(Elliptic Curve Cryptography)是非对称加密里的“后起之秀”,它基于“椭圆曲线离散对数”的数学难题,使用特定的曲线方程和基点生成公钥和私钥,子算法 ECDHE 用于密钥交换,ECDSA 用于数字签名 。
比起 RSA,ECC 在安全强度和性能上都有明显的优势 。160 位的 ECC 相当于 1024 位的 RSA,而 224 位的 ECC 则相当于 2048 位的 RSA 。因为密钥短,所以相应的计算量、消耗的内存和带宽也就少,加密解密的性能就上去了,对于现在的移动互联网非常有吸引力 。
对称加密的优点是运算速度快,缺点是互联网环境下无法将密钥安全的传送给对方 。非对称加密的优点是可以安全的将公钥传递给对方,但是运算速度慢 。
看到这里,你是不是认为可以抛弃对称加密,只用非对称加密来实现机密性呢?
这里 TLS 把对称加密和非对称加密结合起来,两者互相取长补短,即能高效地加密解密,又能安全地密钥交换 。其实说穿了也很简单:
在通信刚开始的时候使用非对称算法,比如 RSA、ECDHE,首先解决密钥交换的问题 。
然后用随机数产生对称算法使用的“会话密钥”(session key),再用公钥加密 。因为会话密钥很短,通常只有 16 字节或 32 字节,所以慢一点也无所谓 。
对方拿到密文后用私钥解密,取出会话密钥 。这样,双方就实现了对称密钥的安全交换,后续就不再使用非对称加密,全都使用对称加密 。
详解版 深入浅出 HTTPS

文章插图
 
这样混合加密就解决了对称加密算法的密钥交换问题,而且安全和性能兼顾,完美地实现了机密性 。
不过这只是“万里长征的第一步”,后面还有完整性、身份认证、不可否认等特性没有实现,所以现在的通信还不是绝对安全 。
数字签名与证书黑客虽然拿不到会话密钥,无法破解密文,但可以通过窃听收集到足够多的密文,再尝试着修改、重组后发给网站 。因为没有完整性保证,服务器只能“照单全收”,然后他就可以通过服务器的响应获取进一步的线索,最终就会破解出明文 。
另外,黑客也可以伪造身份发布公钥 。如果你拿到了假的公钥,混合加密就完全失效了 。你以为自己是在和“某宝”通信,实际上网线的另一端却是黑客,银行卡号、密码等敏感信息就在“安全”的通信过程中被窃取了 。
所以,在机密性的基础上还必须加上完整性、身份认证等特性,才能实现真正的安全 。
摘要算法实现完整性的手段主要是摘要算法(Digest Algorithm),也就是常说的散列函数、哈希函数(Hash Function) 。
你可以把摘要算法近似地理解成一种特殊的压缩算法,它能够把任意长度的数据“压缩”成固定长度、而且独一无二的“摘要”字符串,就好像是给这段数据生成了一个数字“指纹” 。
换一个角度,也可以把摘要算法理解成特殊的“单向”加密算法,它只有算法,没有密钥,加密后的数据无法解密,不能从摘要逆推出原文 。
详解版 深入浅出 HTTPS

文章插图
【详解版 深入浅出 HTTPS】 
摘要算法实际上是把数据从一个“大空间”映射到了“小空间”,所以就存在“冲突”(collision,也叫碰撞)的可能性,就如同现实中的指纹一样,可能会有两份不同的原文对应相同的摘要 。好的摘要算法必须能够“抵抗冲突”,让这种可能性尽量地小 。
因为摘要算法对输入具有“单向性”和“雪崩效应”,输入的微小不同会导致输出的剧烈变化,所以也被 TLS 用来生成伪随机数(PRF,pseudo random function) 。


推荐阅读