Http有不少缺陷,安全就是其中之一。Http使用明文传输,并且在传输过程中可被截获,产生不少的安全隐患。并且自身上难以解决问题,新的协议Https应运而生。
Https
Https保留了Http的工作原理,在TCP和Http两层之间添加了SSL/TLS层,具体位于OSI模型的会话层。SSL/TLS也称为传输层安全协议。
安全通信必须实现四个特性:机密性、完整性,身份认证和不可否认。片面来讲,传输内容需经过加密,数据接收方可以验证传输内容的完整性,传输双方都可确认彼此身份,不能否认已经发生过的行为。
SSL/TLS
SSL(安全套接层)在发展成熟后改名为TLS(传输层安全),正式标准化。TLS处于OSI模型的会话层,用于在会话层对传输进行加密、身份验证等。用到了对称加密、非对称加密、身份认证等密码学技术。
TLS必须选用一组加密算法,称为加密套件。加密套件由固定部分组成,通常形式是“密匙交换算法+签名算法+对称加密算法+摘要算法”。TLS底层使用了OpenSSL,是一个加密算法工具包。
机密性实现
实现机密性的最主要方式为加密,加密方式大体分为对称加密和非对称加密。被加密的数据称为明文,加密规则称为秘钥,加密后的数据成为密文,将密文还原成明文称为解密。加密算法是开源的,但加密后需要特定的秘钥才可解密,所以秘钥的保存至关重要。
对称加密
对称加密在加密和解密时使用同一个秘钥。运行机制为:传输端将报文加密为密文(避免明文传输)传输到接收端,接收端用相同的算法、秘钥解密。
TLS 里有非常多的对称加密算法可供选择,比如 RC4、DES、3DES、AES、ChaCha20 等,但前三种算法都被认为是不安全的,通常都禁止使用,目前常用的只有 AES 和 ChaCha20。
ChaCha20算法密匙长度为256位,算法的纯软件性能较优。AES安全强度高、性能好,并且在硬件层面上做了优化,使用更加广泛。
非对称加密
对称加密的思路很清晰,但在两个端点,一方如何知道另一方设置的秘钥呢?和密文一起发送的话,秘钥也会被加密,无限循环。因此出现了非对称加密用于秘钥交换。
非对称加密在加密解密两端使用不同的秘钥,称为公钥和私钥。加密和解密时对立的,即公钥加密私钥解密或者私钥加密公钥解密。公钥可公开,私钥须严格保密。
通常由网站保管私钥,公钥可分发出去,双方共用一套加密算法。用户通过公钥加密明文为密文,网站则根据私钥将密文解密为明文。如此就实现了秘钥交换。
但是非对称算法的设计比对称算法难的多,都是根据数学难题设计而成,常见的有REA、ECC。REA的秘钥推荐长度我1024,历史更加悠久;ECC的秘钥推荐长度仅为160位以上,更加新兴,因为秘钥长度更短所以计算性能更好。
混合加密
非对称加密虽然在功能上更加安全且可以解决秘钥交换,但其计算性能太差,而这在计算机通信中根本不可接受。非对称加密和对称加密组合是更为可行的方案。
即明文的直接加密解密还是由对称加密算法解决。但是对称加密的秘钥通过非对称加密在客户端和网站之间交换。
至此,已经实现了安全传输的机密性。
完整性实现
有个机密性后,解决了明文传输产生的问题,但密文在传输过程中仍可被截获。虽不能被识别,但可被修改、重组然后再交给接收方,甚至可凭借彼此之间的交换对应关系破解密匙,但双方可能都察觉不到。所以,需加入完整性检测。
摘要算法
摘要算法可根据具体数据生成固定的独一无二的一串字符。类似于生成了数据的指纹。
摘要算法推荐使用的是SHA-2系列算法,具体包含SHA224、SHA256、SHA384,分别能够生成 28 字节、32 字节、48 字节的摘要。
在发送端使用摘要算法,生成摘要字符串,伴随数据一起传输到接收端后,接收端用相同的摘要算法生成摘要字符串,与发送过来的摘要字符串对比,不相同则表明数据不完整。完整性也需建立在机密性之上,生成的摘要字符串也需加密,不然忙活了半天功亏一篑。
身份认证实现
实现了机密性和完整性基本解决了传输过程中的安全问题,但两端点的安全问题还在。作为用户可能会访问到伪装的恶意网站,作为网站服务方也可能会收到黑客伪装的用户请求。所以身份认证目的在于确定两端点都是可信的。日渐普及的网络实名认证在很久很久之前已在Https中实现了,只不过没那么具体,只需判断请求来自真实的用户。
数字签名
实现认证需要独一无二的东西,可以证明身份。联系之前所接触东西,摘要算法可生成独一无二的摘要字符串;而非对称加密中的私钥为用户所私有。结合摘要算法和私钥即可生成代表用户身份的数字签名。
数字证书
实现的思路已经有了,那么其中用来解密的公钥又有什么问题呢。公钥每个人都可发布,所以并不是所有公钥都有可信度。这时候需要引入第三方公信机构掌控公钥的可信度。
这个第三方机构就是证书认证机构(CA),负责给公钥签名,用自身的公信保证公钥的可信度。签名包含公钥的序列号、用途、颁发者、有效时间,将这些信息打包签名,形成数字证书。
CA也有大有小,分不同层级,小CA需要大CA认证,一直向上直到根CA,根CA不需要其他认证,集中了CA的公信。
数字证书的验证
通常情况下,服务器需向客户端发送数字证书,客户端进行验证。在操作系统和浏览器中已经内置了各大根证书,所发数字证书逐级向上验证,直到根证书,验证完成。
至此实现了也就身份验证和不可否认。