贤菜

V1

2022/02/22阅读:51主题:简

一文搞懂https为什么安全

预告

在日常工作中,线上很多接口要求必须是https,其原因是相比http,https访问更安全。通过阅读本文,读者将会了解https为什么安全,中间人攻击,以及证书和加解密方式。https是基于TLS(1999年互联网标准化组织IETF对SSL进行标准化,发布TLS,习惯将SSL和TLS并称为SSL/TLS,本文简称为TLS)。

1 问题背景

最近在排查某个业务请求非常慢的问题,请求有时候10多秒,有时候30多秒,甚至达60多秒,谁也没想到慢的原因居然是TLS握手很慢,慢的实在是夸张了。如下所示首次握手就花了13秒多。

为方便排查问题,对TLS握手过程进行回顾。

2 TLS四次握手

四次握手过程如下图所示, 通过四次握手,协商出对称加密的密钥,此后通过该对称密钥对数据进行加密传输,保障数据传输安全。其中最关键的是这个密钥如何传输,才能保障安全?下面让我们带着疑问一起来探究。

3 加解密方式

3.1 对称加密

也称为单密钥加密,是指同一个密钥可以同时用作信息的加密和解密。 其过程如下图所示。

这种方式会面临哪些问题?

3.2 非对称加密

非对称加密算法需要两个密钥来进行加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥),可分为签名和验签、加密和解密两个过程。

  • 签名和验签。私钥签名,公钥验签,目的是验证来源,是否被篡改。
  • 加密和解密。公钥加密,私钥解密,目的是防止数据被截取,即使被截取了,也会因为没有私钥,也无法解密。 使用上可分为以下两种。

3.2.1 单向非对称加密

客户端没有公私钥,服务端把公钥给到客户端,客服端用公钥加密,服务端用公钥解密。 如果用这种方式协商出对称加密密钥,会面临哪些问题?

3.2.1 双向非对称加密

客户端有公私钥,服务端也有(比如以前银行转账发的设备)。

  • 客户端发送消息给服务端。客户端用自己的私钥加签,再用服务端的公钥加密。服务端接收时,用客户端的公钥验签,用自己的私钥解密。
  • 服务端发送消息给客户端。服务端用自己的私钥加签,再用客户端的公钥加密。客户端接收时,用服务端的公钥验签,用自己的私钥解密。

如果用这种方式协商出对称加密密钥,会面临哪些问题?

不管是对称加密还是非对称加密,都面临密钥如何传输的问题,都存在中间人攻击的风险。

4 中间人攻击

如果有中间人加入客户端和服务端通信过程中,客户端和服务端其实并不知道他们在和中间人通信,中间人对数据可进行随意修改,出现安全隐患。

5 数字证书

TLS为解决密钥传输的问题,引入了一个中间机构CA(从技术上讲就是一台服务器),服务器先把自己的公钥发给CA,CA就会给该服务器颁发一个数字证书,证书中包含了公钥信息。

5.1 证书获取

服务端将公钥给到CA,CA生成数字签名证书,给到服务端,证书内容一般包括证书序列号、证书有效期和公开密钥等信息。

5.2 证书分类

目前证书类型有X.509v3(1997)、 X509v4(1997)、 X.509v1(1988)等。比较常用的版本是TUTrec.x.509V3,由国际电信联盟制定。证书具有安全性,唯一性,便利性。

5.2 证书为什么可信

根证书是无条件信任的,如下图所示, mac上的根证书 根证书下面有很多子证书,子证书由上级证书授权认证。下图为ubuntu下的证书链。 如何把根证书比作中央政府,那么下级可以是省政府,市政府,县等,一级一级往下授权。

6 后记

6.1 常用对称加密算法

  • DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;
  • 3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;
  • AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高,支持128、192、256、512位密钥的加密;

6.2 常用非对称加密算法

  • RSA:RSA 是目前应用最广泛的数字加密和签名技术,比如国内的支付宝就是通过RSA算法来进行签名验证。它的安全程度取决于秘钥的长度,目前主流可选秘钥长度为 1024位、2048位、4096位等,理论上秘钥越长越难于破解,按照维基百科上的说法,小于等于256位的秘钥,在一台个人电脑上花几个小时就能被破解,512位的秘钥和768位的秘钥也分别在1999年和2009年被成功破解,虽然目前还没有公开资料证实有人能够成功破解1024位的秘钥,但显然距离这个节点也并不遥远,所以目前业界推荐使用 2048 位或以上的秘钥,不过目前看 2048 位的秘钥已经足够安全了,支付宝的官方文档上推荐也是2048位,当然更长的秘钥更安全,但也意味着会产生更大的性能开销。
  • DSA:既 Digital Signature Algorithm,数字签名算法,他是由美国国家标准与技术研究所(NIST)与1991年提出。和 RSA 不同的是 DSA 仅能用于数字签名,不能进行数据加密解密,其安全性和RSA相当,但其性能要比RSA快。
  • ECDSA:椭圆曲线签名算法,是ECC(Elliptic curve cryptography,椭圆曲线密码学)和 DSA 的结合,相比于RSA算法,ECC 可以使用更小的秘钥,更高的效率,提供更高的安全保障,据称256位的ECC秘钥的安全性等同于3072位的RSA秘钥,和普通DSA相比,ECDSA在计算秘钥的过程中,部分因子使用了椭圆曲线算法。

欢迎大家加入,一起交流学习。

分类:

后端

标签:

后端

作者介绍

贤菜
V1