HTTPS学习笔记(一)
HTTPS特性
- 机密性:(Secrecy/Confidentiality)数据的“保密”,只能由可信的人访问,对其他人是不可见的“秘密”,简单来说就是不能让不相关的人看到不该看的东西。
- 完整性/一致性:(Integrity)数据在传输过程中没有被篡改,不多也不少,“完完整整”地保持着原状。
- 身份认证:(Authentication)确认对方的真实身份,也就是“证明你真的是你”,保证消息只能发送给可信的人。
- 不可否认:(Non-repudiation/Undeniable)也叫不可抵赖,意思是不能否认已经发生过的行为,不能“说话不算数”“耍赖皮”。
HTTP的默认端口号:443
HTTP的默认端口号:80
HTTP下层的传输协议:TCP/IP
HTTPS下层的传输协议:SSL/TLS
SSL/TLS
SSL :即安全套接层(Secure Sockets Layer),在 OSI 模型中处于第 5 层(会话层),由网景公司于 1994 年发明
TLS:互联网工程组 IETF 在 1999 年把它改名为 TLS
浏览器和服务器在使用TLS建立连接时,需要选择一套恰当的加密算法来实现安全通信,这些算法的组合被称为:“密码套件”
密码套件:密钥交换算法 + 签名算法 + 对称加密算法 + 摘要算法
除了HTTP,SSL/TLS也可以承载其他的应用协议,例如FTP=>FTPS,LDAP=>LDAPS等。
TLS中的对称加密算法
RC4、DES、3DES、AES、ChaCha20 等,但前三种算法都被认为是不安全的,通常都禁止使用,目前常用的只有AES 和 ChaCha20。
DES
和AES
只能加密固定长度的明文AES
: 的意思是“高级加密标准”(Advanced Encryption Standard),密钥长度可以是 128、192 或 256。它是 DES 算法的替代者,安全强度很高,性能也很好,而且有的硬件还会做特殊优化,所以非常流行,是应用最广泛的对称加密算法。ChaCha20
:是 Google 设计的另一种加密算法,密钥长度固定为 256 位,纯软件运行性能要超过 AES,曾经在移动客户端上比较流行,但 ARMv8 之后也加入了 AES 硬件优化,所以现在不再具有明显的优势,但仍然算得上是一个不错的算法。
加密分组模式
可以让算法用固定长度的密钥加密任意长度的明文,把小秘密转化为大秘密。
最新的分组模式被称为 AEAD(Authenticated Encryption with Associated Data),在加密的同时增加了认证的功能,常用的是 GCM、CCM 和 Poly1305。
- AES128-GCM,意思是密钥长度为 128 位的 AES 算法,使用的分组模式是 GCM;
- ChaCha20-Poly1305 的意思是 ChaCha20 算法,使用的分组模式是 Poly1305。
非对称加密算法
对称加密的问题:如何将密钥传递给对方?
这就需要非对称加密了。
有两个密钥,一个叫“公钥”(public key),一个叫“私钥”(private key)。
两个密钥是不同的,“不对称”,公钥可以公开给任何人使用,而私钥必须严格保密。
公钥和私钥有个特别的“单向”性,虽然都可以用来加密解密,但公钥加密后只能用私钥解密,反过来,私钥加密后也只能用公钥解密。
相关算法:DH、DSA、RSA、ECC 等。
RSA
:它的安全性基于“整数分解”的数学难题,使用两个超大素数的乘积作为生成密钥的材料,想要从公钥推算出私钥是非常困难的。10 年前 RSA 密钥的推荐长度是 1024,但随着计算机运算能力的提高,现在 1024 已经不安全,普遍认为至少要 2048 位。ECC
(Elliptic Curve Cryptography):是非对称加密里的“后起之秀”,它基于“椭圆曲线离散对数”的数学难题,使用特定的曲线方程和基点生成公钥和私钥,子算法 ECDHE 用于密钥交换,ECDSA 用于数字签名。- 目前比较常用的两个曲线是 P-256(secp256r1,在 OpenSSL 称为 prime256v1)和 x25519。P-256 是 NIST(美国国家标准技术研究所)和 NSA(美国国家安全局)推荐使用的曲线,而 x25519 被认为是最安全、最快速的曲线。
- ECC 在安全强度和性能上都有明显的优势。160 位的 ECC 相当于 1024 位的 RSA,而 224 位的 ECC 则相当于 2048 位的 RSA。因为密钥短,所以相应的计算量、消耗的内存和带宽也就少,加密解密的性能就上去了,对于现在的移动互联网非常有吸引力。
混合加密
混合加密实现了机密性
混合加密的原因在于:非对称加密虽然解决了密钥交换的问题;但是,非对称加密是基于复杂的数学难题,运算速度很慢,即使是 ECC 也要比 AES 差上好几个数量级。如果仅用非对称加密,虽然保证了安全,但通信速度有如乌龟、蜗牛,实用性就变成了零。
1 | plain = hello openssl |
可以看到,RSA 的运算速度是非常慢的,2048 位的加解密大约是 15KB/S(微秒或毫秒级),而 AES128 则是 13MB/S(纳秒级),差了几百倍。
混合加密的步骤:
在通信刚开始的时候使用非对称算法,比如 RSA、ECDHE,首先解决密钥交换的问题。(即服务端生成公钥和私钥,非对称算法将公钥传递给客户端)
然后用随机数产生对称算法使用的“会话密钥”(session key)(客户端生成),再用(服务端的)公钥加密。因为会话密钥很短,通常只有 16 字节或 32 字节,所以慢一点也无所谓。
服务端拿到密文后用其私钥私钥解密,取出会话密钥。
细节步骤参考:
其他知识补充
- 比特币、以太坊等区块链技术里也用到了ECC(非对称加密),它们选择的曲线是secp256k1。
- 由于密码学界普遍不信任NIST和NSA,怀疑secp 系列曲线有潜在的弱点,所以研究出了“x25519”,它的名字来源于曲线方程里的参数“2^255 - 19”。另有一个更高强度的曲线“x448”,参数是“2^448 - 2^224 - 1”。
- TLS1.2要求必须实现TLS_RSA_WITH_AES_128_CBC_SHA,TLS1.3要求必须实现TLS_AES_128_GCM_SHA256,并且因为前向安全的原因废除了DH和 RSA密钥交换算法。
- 非对称加密慢的原因:
- 非对称加密基于大数运算,比如大素数或者椭圆曲线,是复杂的数学难题,所以消耗计算量,运算速度慢。
- 除了慢,可能还有一个缺点就是需要更多的位数,相同强度的对称密钥要比非对称密钥短。
- 对称密钥一般都128位、256位,而rsa一般要2048位,不过椭圆曲线的会短一点。
- 简单来说,SSL 就是通信双方通过非对称加密协商出一个用于对称加密的密钥(会话密钥)。
- 会话密钥:即一次会话使用一次密钥,之前的都会被废弃,就算被别人破解了也仅仅是破解了一个会话。