理解SSL,TLS和HTTPS

TLS(Transport Layer Security Protocol):安全传输层协议

SSL运行在TCP/IP层之上、应用层之下

SSL

SSL 安全套接字层. SSL介于应用层和TCP层之间。应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头。勉强可以划到传输层,

在SSL中会

1. 使用密钥交换算法交换密钥;
2. 使用密钥对数据进行加密;
3. 使用散列算法对数据的完整性进行验证
4. 使用数字证书证明自己的身份。

特性:

1. 保密安全:在握手协议中定义会话密钥后,所有的消息都是被加密传输的。
2. 鉴别身份,可选的客户端认证,和强制的服务端认证。
3. 防篡改的完整性,传输数据的数据完整性检查。

好了,下面开始介绍SSL协议。

SSL工作原理

分为记录协议,握手协议,警报协议。

握手协议是在应用程序数据传输之前使用的,主要的目的是为了互相验证,协商加密算法和加密密钥等信息(用来保护SSL记录里的发送的数据的安全性)

握手协议包含一下三个字段

  1. Type: 表示10种消息类型之一
  2. length:表示消息体长度字节数
  3. content:与消息相关的参数

SSL握手协议字段

握手过程(4个阶段)

  1. 客户端向服务端发送Client Hello,携带信息有:协议版本号,客户端随机数Client Random A,客户端支持的加密方法列表
  2. 服务端根据客户端支持的加密算法选择确认双方使用的加密方法,然后将这个加密方法信息,再带上数字证书(certificate),服务端随机数Server Random B,返回给客户端,最终发送Server Hello Done。(注意这里其实还有可选的进一步校验,比如如果服务端要求验证客户端更多的信息,可以发送certificate request,还有server key exchange。)
  3. 客户端确认服务端返回的证书有效性,然后再根据AB两个随机数再生成一个新的随机数(Premaster Secret),然后使用证书中的公钥对这个Premaster Secret加密,发送给服务端。(注意,这里也可选的可以有一个server key exchange)
  4. 服务端通过私钥解析出客户端生成的Premaster Secret,然后根据约定的加密方法,使用A,B,Premaster Secret三个随机数,来生成最终的”对话密钥”(Session Key), 用来加密接下来的整个会话过程里的数据了。

这里A,B都是不安全的,生成session key的方法是公开的,关键的key在于premaster secret,这个被认为最具有随机性的一个key,通过A+B+PremasterKey生成session key的公开算法,就得到了最后的秘钥了。 用图来说明的话,如下:

SSL Handshake

Session的恢复

握手阶段用来建立SSL连接。如果出于某种原因,对话中断,就需要重新握手。 这时有两种方法可以恢复原来的session:一种叫做session ID,另一种叫做session ticket。

TLS

TLS 握手协议提供的连接安全具有三个基本属性:
可以使用非对称的,或公共密钥的密码术来认证对等方的身份。该认证是可选的,但至少需要一个结点方。 共享加密密钥的协商是安全的。对偷窃者来说协商加密是难以获得的。此外经过认证过的连接不能获得加密,即使是进入连接中间的攻击者也不能。 协商是可靠的。没有经过通信方成员的检测,任何攻击者都不能修改通信协商。

TLS的最大优势就在于:TLS是独立于应用协议。高层协议可以透明地分布在TLS协议上面。然而, TLS 标准并没有规定应用程序如何在TLS上增加安全性;它把如何启动 TLS 握手协议以及如何解释交换的认证证书的决定权留给协议的设计者和实施者来判断。

TLS记录协议是一种分层协议。每一层中的信息可能包含长度、描述和内容等字段。记录协议支持信息传输、将数据分段到可处理块、压缩数据、应用MAC 、加密以及传输结果等。对接收到的数据进行解密、校验、解压缩、重组等,然后将它们传送到高层客户机。 参考链接:

在TLS与SSL3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作。

TLS与SSL的差异

  1. 版本号:TLS记录格式与SSL记录格式相同,但版本号的值不同,TLS的版本1.0使用的版本号为SSLv3.1。

  2. 报文鉴别码:SSLv3.0和TLS的MAC算法及MAC计算的范围不同。TLS使用了RFC-2104定义的HMAC算法。SSLv3.0使用了相似的算法,两者差别在于SSLv3.0中,填充字节与密钥之间采用的是连接运算,而HMAC算法采用的是异或运算。但是两者的安全程度是相同的。

  3. 伪随机函数:TLS使用了称为PRF的伪随机函数来将密钥扩展成数据块,是更安全的方式。

  4. 报警代码:TLS支持几乎所有的SSLv3.0报警代码,而且TLS还补充定义了很多报警代码,如解密失败(decryption_failed)、记录溢出(record_overflow)、未知CA(unknown_ca)、拒绝访问(access_denied)等。

  5. 密文族和客户证书:SSLv3.0和TLS存在少量差别,即TLS不支持Fortezza密钥交换、加密算法和客户证书。
  6. certificate_verify和finished消息:SSLv3.0和TLS在用certificate_verify和finished消息计算MD5和SHA-1散列码时,计算的输入有少许差别,但安全性相当。
  7. 加密计算:TLS与SSLv3.0在计算主密值(master secret)时采用的方式不同。
  8. 填充:用户数据加密之前需要增加的填充字节。在SSL中,填充后的数据长度要达到密文块长度的最小整数倍。而在TLS中,填充后的数据长度可以是密文块长度的任意整数倍(但填充的最大长度为255字节),这种方式可以防止基于对报文长度进行分析的攻击。

TLS 的最大优势

TLS 的最大优势就在于:TLS 是独立于应用协议。高层协议可以透明地分布在 TLS 协议上面。然而,TLS 标准并没有规定应用程序如何在 TLS 上增加安全性;它把如何启动 TLS 握手协议以及如何解释交换的认证证书的决定权留给协议的设计者和实施者来判断。 TLS包含三个基本阶段: 1.对等协商支援的密钥算法 2.基于私钥加密交换公钥、基于PKI证书的身份认证 3.基于公钥加密的数据传输保密

HTTPS是什么

通常所说的 HTTPS 协议,说白了就是“HTTP 协议”和“SSL/TLS 协议”的组合。你可以把 HTTPS 大致理解为——“HTTP over SSL”或“HTTP over TLS”(反正 SSL 和 TLS 差不多)。

加解密

对称加密

  • 对称加密指的是可以使用同一个密钥对内容进行加密和解密。相比非对称加密,它的特点是加、解密速度快,并且加密的内容长度几乎没有限制,简单的表达式就是

发送者加密信息:encrypted_message = func1(message, key),

接收者解密信息:message = func2(encrypted_message, key)

其中根据不同的算法,func1有可能会等于func2,也有可能不同。 IC168364

  • 现在常用的对称密钥主要分成两种,块式加密和流式加密,他们的基本思想都是对信息进行XOR、移位等操作来进行加密的。在操作方式上块式加密是把message分成多个固定长度的组,每组包含多个字节,每次操作的时候会针对一组字节进行操作,鼎鼎大名的DES和AES就是采用这类方式。而流式加密是每次只针对一个字节进行操作,鼎鼎大名的RC4就是采用这种方式。

  • DES的原理

    • 我们将需要加密的消息分成长度为64bits的一堆block,对每个block通过XOR、移位等等方式进行加密,DES的密钥(key)长度是64bits,有效长度是56bits,因为其中的8个bits用于校验。另外DES有一个特点就是对于同一个block,如果使用同一个密钥(key),加密出来的结果是相同的,换句话说攻击者可以通过寻找同样的密文block来推理出原文,这就是我们常说的回放攻击。
    • 为了解决回放攻击的问题,最简单的方式就是CBC(cipher block chaining),简单说来就是每次加密一个block之后,把它和前一个block的密文进行XOR操作,作为这个block的密文,这样即便是同样的block,每次加密的结果也会不一样,攻击者就无法通过密文猜测原文了。另外第一个block因为在它之前没有其他block了,所以我们需要生成一个随机的64bit的intialization vector(类似我们在写程序对用户密码加密的时候搞的salt)给第一个block进行XOR操作。 601px_CBC_encryption_svg
    • 3DES是在DES的基础上将密钥扩充为原来的3倍也就是192bits(实际有效密钥长度是56bits*3=168bits),3DES的加密过程其实就是将密钥分成三份,使用第一份密钥加密、第二份密钥解密、第三份密钥加密,然后解密的话刚好相反,使用第三份密钥解密,第二份密钥加密和第一份密钥解密,通过这种方式去扩展DES的加密长度问题,3DES更加安全,也能抵挡之前说的回放攻击。
  • AES的原理

    • 3DES虽然很安全,但是因为多次的加解密导致性能其实很低的,所以数学家们希望在同样的密钥长度下使用更高效率的算法,于是有了AES。
    • AES允许密钥长度为128-bit,192-bit和256-bit,当前来说使用128-bit已经足够安全,并且性能比3DES快很多,所以现在使用最多的对称加密就是AES。
  • RC4的原理

    • 如果把block的size变成了1 byte那么就变成了stream加密算法,当然具体的实现肯定不一样,block式加密主要是将block里面的每个bit进行移位,而stream加密是生成同样长度的、安全的字符串,然后再和原文进行XOR生成最终的密文,所以stream的安全性主要取决于这个安全字符串的生成算法,同样因为RC4安全性取决于安全字符串的生成,所以它不需要CBC或者IV。 总的来说对称加密性能高、速度快,但是它的前提是必须双方都知道这个共同的密钥,而这个密钥又不可以被第三方知道,否则他们也是可以解密密文。为了解决密钥传输的问题,数学家又发明了非对称加密的算法,相比而言,非对称加密解决了密钥本身的安全传输问题,但是他的性能相比对称加密来说相差几万倍,而且对所加密的内容也有长度的限制。

参考链接

  1. http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html