按关键词阅读:
非对称加密可以解决“密钥交换”的问题 。 网站秘密保管私钥 , 在网上任意分发公钥 , 你想要登录网站只要用公钥加密就行了 , 密文只能由私钥持有者才能解密 。 而黑客因为没有私钥 , 所以就无法破解密文 。
非对称加密算法的设计要比对称算法难得多 , 在 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) 。
你可以把摘要算法近似地理解成一种特殊的压缩算法 , 它能够把任意长度的数据“压缩”成固定长度、而且独一无二的“摘要”字符串 , 就好像是给这段数据生成了一个数字“指纹” 。
换一个角度 , 也可以把摘要算法理解成特殊的“单向”加密算法 , 它只有算法 , 没有密钥 , 加密后的数据无法解密 , 不能从摘要逆推出原文 。
文章插图摘要算法实际上是把数据从一个“大空间”映射到了“小空间” , 所以就存在“冲突”(collision , 也叫碰撞)的可能性 , 就如同现实中的指纹一样 , 可能会有两份不同的原文对应相同的摘要 。 好的摘要算法必须能够“抵抗冲突” , 让这种可能性尽量地小 。
因为摘要算法对输入具有“单向性”和“雪崩效应” , 输入的微小不同会导致输出的剧烈变化 , 所以也被 TLS 用来生成伪随机数(PRF , pseudo random function) 。
你一定在日常工作中听过、或者用过 MD5(Message-Digest 5)、SHA-1(Secure Hash Algorithm 1) , 它们就是最常用的两个摘要算法 , 能够生成 16 字节和 20 字节长度的数字摘要 。 但这两个算法的安全强度比较低 , 不够安全 , 在 TLS 里已经被禁止使用了 。
稿源:(未知)
【傻大方】网址:http://www.shadafang.com/c/111J2Hc2020.html
标题:深入浅出 HTTPS (详解版)( 二 )