非对称加密可以解决“密钥交换”的问题 。网站秘密保管私钥,在网上任意分发公钥,你想要登录网站只要用公钥加密就行了,密文只能由私钥持有者才能解密 。而黑客因为没有私钥,所以就无法破解密文 。
非对称加密算法的设计要比对称算法难得多,在 TLS 里只有很少的几种,比如 DH、DSA、RSA、ECC 等 。
- RSA 可能是其中最著名的一个,几乎可以说是非对称加密的代名词,它的安全性基于“整数分解”的数学难题,使用两个超大素数的乘积作为生成密钥的材料,想要从公钥推算出私钥是非常困难的 。10 年前 RSA 密钥的推荐长度是 1024,但随着计算机运算能力的提高,现在 1024 已经不安全,普遍认为至少要 2048 位 。
- ECC(Elliptic Curve Cryptography)是非对称加密里的“后起之秀”,它基于“椭圆曲线离散对数”的数学难题,使用特定的曲线方程和基点生成公钥和私钥,子算法 ECDHE 用于密钥交换,ECDSA 用于数字签名 。
对称加密的优点是运算速度快,缺点是互联网环境下无法将密钥安全的传送给对方 。非对称加密的优点是可以安全的将公钥传递给对方,但是运算速度慢 。
看到这里,你是不是认为可以抛弃对称加密,只用非对称加密来实现机密性呢?这里 TLS 把对称加密和非对称加密结合起来,两者互相取长补短,即能高效地加密解密,又能安全地密钥交换 。其实说穿了也很简单:
在通信刚开始的时候使用非对称算法,比如 RSA、ECDHE,首先解决密钥交换的问题 。
然后用随机数产生对称算法使用的“会话密钥”(session key),再用公钥加密 。因为会话密钥很短,通常只有 16 字节或 32 字节,所以慢一点也无所谓 。
对方拿到密文后用私钥解密,取出会话密钥 。这样,双方就实现了对称密钥的安全交换,后续就不再使用非对称加密,全都使用对称加密 。

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

文章插图
【详解版 深入浅出 HTTPS】
摘要算法实际上是把数据从一个“大空间”映射到了“小空间”,所以就存在“冲突”(collision,也叫碰撞)的可能性,就如同现实中的指纹一样,可能会有两份不同的原文对应相同的摘要 。好的摘要算法必须能够“抵抗冲突”,让这种可能性尽量地小 。
因为摘要算法对输入具有“单向性”和“雪崩效应”,输入的微小不同会导致输出的剧烈变化,所以也被 TLS 用来生成伪随机数(PRF,pseudo random function) 。
推荐阅读
- 详解 gcc 编译、链接原理—揭开应用程序运行背后的奥秘
- JAVA中常见的阻塞队列详解
- 支付宝app支付服务端的实现-Java版
- 白条体验版多久升级 京东白条体验版额度不会升了吗
- 有限状态机 多图详解TCP三次握手和四次挥手
- 玛卡泡茶有副作用吗,西双版纳有哪些茶区
- 华强北顶配airpods2与正品对比 华强北二代airpods和原版对比
- .NET 5.0 正式版发布:应用可在ARM64设备上原生运行
- 一文详解操作系统进程管理
- 谈恋爱的技巧的方法详解
