cloudsmiles

屠龙勇士终被恶龙吞噬

  • 主页
  • 随笔
所有文章 关于我

cloudsmiles

屠龙勇士终被恶龙吞噬

  • 主页
  • 随笔

HTTP安全

2019-11-01

最近群里有个人去腾讯面试,被考试官问到,http和https的区别,还问到密码学的知识,他说不太懂,我有点惊讶,抛开密码学的层面,这也是计算机网络的基本内容(虽然我也是上一周才回顾到),于是就有了这篇文章,拾人牙慧,锤人头胀。
本文只是简单介绍密码学的基础知识,顺便带出https的原理,以https为例,可以发现但很多加密的工具也是由基础的工具叠加组合的。



1. 对称密码

对称密码(symmetric cryptography),是指在加密和解密的时候都使用同一密钥的方式。

它的优点在于巨大的密钥空间能够抵御暴力破解,而且加解密运算效率高,但缺点是密钥配送问题,就是指A,B通讯,信息是加密了,但是密钥怎么在不暴露的情况下让A和B都知道。

常见使用的算法:DES(Data Encryption Standard),AES(Advanced Encryption Standard)

用途:加密信息

2. 公钥密码

公钥密码(public-key cryptography),是指在加密和解密的时候使用不同密钥的方式,与对称加密正好相反,所以也被称为非对称密码(asymmetric cryptography)。

它是由公钥(public key)和私钥(private key)组成,加密过程是A向B发送message时,利用B的public key对message加密;B接受message,利用B的private key对message解密。

它的优点是解决了密钥配送问题(公钥可以公开),缺点是加密算法效率低(无法直接用于信息加密),存在中间人攻击,指的是B虽然能解密成功,但无法确认对方就是A,也有可能是其他人伪装了,挟持了message向B发送。

常见使用的算法:RSA

用途:加密对称加密的密钥,身份认证

2.1 实际案例(github ssh登录配置)

我们经常会需要在github上配置SSH key,配置了以后,就不需要用户名和密码,也能方便的push代码。(github有两种方式克隆代码,ssh和https,以至于push代码会有不一样的认证)

首先我们使用命令生成key

1
2
$ cd ~/.ssh
$ ssh-keygen -t rsa -C "your_email@example.com"

通过一些步骤,成功生成之后,我们就能在当前目录,找到id_rsa.pub和id_rsa文件,就是公钥和私钥。
把公钥粘贴到github上去,就完成了github ssh key的配置

avatar

ssh登录实际上是利用了非对称密码的逆过程,达到了身份认证的效果(可以辨别对方是谁),从而实现安全可靠的登录,在数字签名有细讲


3. 单向散列函数

后面讲到的技术都并不是直接用于加密的,单向数列函数通过一个不可逆的函数y=f(x)将x映射为y,通过判断y是否变化,来判断x是否被篡改。比如我们常用的MD5算法,就是经常用来判断传输数据是否一致。单向散列函数又被称作为HASH算法。

它的优点是算法效率高,可以辨别篡改,但缺点是没法识别身份,不知道信息来源。

常见使用的算法:MD5(Message-Digest Algorithm),SHA1(Secure Hash Algorithm)

用途:判断篡改,消息认证码,数字签名等

MD5和SHA1经常被用来当做加密算法,但本身两者都是信息摘要的算法,意思就是摘录信息的指纹信息,并没有加密的用法。
而且MD5因为被验证会有碰撞出现,所以现在更为安全的是使用SHA1算法


4. 数字签名

由于非对称加密无法抵御中间人攻击,所以需要有一种方法识别对方的身份,而RSA的牛逼之处来了,它的逆过程,正好可以验证签名

它的逆过程是A的private key对message加密得到数字签名sign,传输给B message和sign,B用A的public key对sign解密回message,对比message是否一致,就能知道对方是否为A的身份(private key只有A知道)。但实际的使用中,RSA的算法效率不高,所以还需要散列函数处理message,这样加密的时候就只是message的摘要信息而已。

这也是为什么github需要保存用户的public key,能够识别该用户而不需要再额外认证

它的优点是能够识别篡改和伪装,还可以防止否认,缺点是由于用到了公钥密码,还是没法理想的解决中间人攻击,因此有证书和颁发证书的认证机构的概念(虽然能识别是A,但public key还是有可能被盗用,所以需要第三方的机构去保证public key的安全性)。

常见使用的算法:RSA+SHA

用途:需要身份认证的场景

4.1 证书

通过上面的讲解可以看出,密码学的基础是对称密码+公钥密码,但它们仍然无法抵御中间人攻击,也即M想办法阻断A和B的直接通信,同时伪装成B然后与A通信,伪装成A然后与B通信。这个问题在密码学看来就是个死循环,因此需要引入额外的技术——社会学知识:让公钥以及数字签名技术成为一种社会性的基础设施,即公钥基础设施(public key intrastructure),简称PKI。而证书,就是将公钥当作一条消息,由一个可信的第三方对其签名后所得到的公钥。


5. 消息认证码

这里不细研究


6. 伪随机数生成器

密钥的由来以及各种算法参数的由来,都是由特定的序列来生成的,所以攻击者很容易推测出密钥,所以还需要有随机数,让攻击者没法推测出来。至于随机数,因为计算机是不可能真正的随机,所以只能根据一定的算法,给一个输入(种子),输出一个伪随机值,但每次的种子一样,输出的随机数序列也是一样的。

至于随机数的其他学问,就暂不在这里细讲了。


7. HTTPS

研究了那么大个圈子,密码学基础究竟跟HTTPS有什么联系呢?

HTTPS(Hyper Text Transfer Protocol Secure),我们也听到其他的叫法SSL(Secure Sockets Layer),TLS(Transport Layer Security),所以我们首先得要知道他们分别的含义。

7.1 HTTPS是什么?

一句话:HTTP的安全版本

百度百科:是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在HTTP 的基础下加入SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。

7.2 SSL是什么?

看一副图就明白了,SSL就是夹在应用层和传输层的中间一层

avatar

7.3 TLS又是什么?

TLS的前身是SSL,相当于SSL某个版本之后,再发展的最新分支,所以又并称为SSL/TLS

HTTPS可以看作是HTTP协议+SSL/TLS层

7.4 为什么要用HTTPS?

不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。

(1) 窃听风险(eavesdropping):第三方可以获知通信内容。

(2) 篡改风险(tampering):第三方可以修改通信内容。

(3) 冒充风险(pretending):第三方可以冒充他人身份参与通信。

SSL/TLS协议是为了解决这三大风险而设计的,希望达到:

(1) 所有信息都是加密传播,第三方无法窃听。

(2) 具有校验机制,一旦被篡改,通信双方会立刻发现。

(3) 配备身份证书,防止身份被冒充。

7.4 工作流程

HTTPS其实是组合用了密码学的基础知识,解决了三大风险,所以是一个很好的例子去体会密码学的价值,我们学习HTTPS的过程,就是重温并应用密码学的过程。

首先看HTTPS的工作流程

avatar

图上的流程可以概括为两部分:(也被称为握手阶段)

(1) 客户端向服务器端索要并验证公钥,对应图上①+②+③+④一部分

(2) 双方协商生成”对话密钥”。对应图上④一部分+⑤+⑥+⑦+⑧

① 客户端发起HTTPS请求,同时告知服务端自身支持使用的加密算法和HASH算法

②+③ 服务端接收之后,从中选择一种加密算法和HASH算法,以证书的形式返回客户端,同时证书还包含公钥,颁证机构,网址,失效日期等

④+⑤ 客户端接收证书之后,会做以下几件事
     1. 通过第三方机构CA,验证证书的合法性(间接验证公钥的合法性)
     2. 生成随机数用作加密的“预主密钥”(pre-master key),再通过服务端的公钥,对预主密钥进行加密(混合加密,public_key保证预主密钥不被暴露)
     3. 握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。    

⑥+⑦ 服务端接收信息
     1. 用自己的私钥解码得到预主密钥,通过预主密钥生成本次会话的“会话密钥”(session key)
     2. 然后向客户端发送握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

至此,整个握手阶段全部结束,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用“会话密钥”加密内容。


总结

  • 密码学基础知识包含对称加密,非对称加密,HASH加密,数字签名,信息认证,随机数等部分
  • HTTPS使用了三种密码学技术解决了三大威胁,分别是混合加密(对称+非对称),数字签名,信息校验(HASH算法)
  • 本文只是简略探讨了密码学的基础知识和实际的应用,真正的知识还是很浩瀚无边,但是我们能从中体会到,很多的安全学问,其实都是基于一些基础知识组装改良而成的,想必其他的知识领域也是如此。
  • HTTP

扫一扫,分享到微信

微信分享二维码
宝可梦之旅
IP初全认识
© 2023 cloudsmiles
Hexo Theme Yilia by Litten