HTTPS原理全解析

HTTPS是超文本传输安全协议,是基于SSL/TLS层以安全为目标的HTTP通道。HTTPS可以对所有的HTTP请求和响应数据在发送到网络之前进行加密。

HTTPS是位于安全层之上的HTTP

SSL/TLS协议

  • SSL Secure Sockets Layer 安全套接层
  • TLS Transport Layer Security 传输层安全,SSL继任者

作用

SSL为了解决以下三大风险设计产生:

  • 加密传播 客户端和服务端的会话是私密的,第三方无法窃听
  • 校验机制 信息一旦被篡改,通信双方会立刻发现
  • 身份证书 防止身份被冒充

另外SSL的设计还要满足以下功能:

  • 效率 加密算法足够快,满足低端客户端和服务端使用
  • 适应性 能够支持当前最知名的安全算法
  • 普适性 基本上所有的客户端和服务端都支持这些协议
  • 可扩展性 在任何地方的任何人都可以立即进行安全通信
  • 在社会上的可行性 满足社会的政治文化需要

历史

  • 1994年,NetScape公司设计了SSL 1.0,但是未公开发布。
  • 1995年2月,NetScape公司修订并发布了SSL 2.0,但很快发现有严重漏洞。
  • 1996年,Netscape和Paul Kocher共同设计了SSL 3.0,获得互联网广泛认可和支持。IETF接手负责该协议,并将其重命名为传输层安全(TLS)协议。
  • 1999年1月,TLS 1.0发布,实质上是SSL 3.0协议的适度改进版。虽然TLS协议和SSL协议是同一个协议的迭代升级,但是其重命名后在名称上造成的混淆一直延续到今天,业内通常将二者统称为SSL/TLS协议。
  • 2006年4月,IETF发布TLS 1.1版本(RFC4346)。
  • 2008年8月,TLS 1.2版本(RFC5246)发布,TLS 1.2协议是目前主流的TLS协议版本。
  • 2018年3月,TLS 1.3协议正式批准问世,成为下一代TLS协议版本。

数字加密

密码

密码(cipher)是一套编码方案:一种特殊的报文编码方式和一种使用响应解码方式的结合体。加密之前的原始报文通常被称为明文(plaintext或cleartext),使用了密码之后的编码报文通常被称作密文(ciphertext)。

密钥

密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥,分别应用在对称密钥加密和非对称密钥加密上。

对称密钥加密

对称密钥加密技术是指信息的发送方和接收方使用同一个密钥去加密和解密数据。其特点是:

  • 算法公开
  • 加/解密速度快
  • 适合对大数据量进行加/解密

对称密钥加密 常见的算法有:DES、Triple-DES、AES、TDEA、BlowFish、RC5、 IDEA

对称密钥加密技术中用到的密钥叫做私钥,私钥表示个人私有的密钥,即该密钥不能被泄露。其加密过程中的私钥与解密过程中用到的私钥是同一个密钥,这也是之所以称之为“对称”的原因。由于对称加密的算法是公开的,所以一旦私钥被泄露,那么 密文 就很容易被破解,所以对称密钥加密的缺点是密钥的安全管理困难。

// 加密:明文 + 加密算法 + 私钥 => 密文
C = Encrypt(data, SecretKey)

// 解密:密文 + 解密算法 + 私钥 => 明文
P = Decrypt(C, SecretKey)

非对称密钥加密

非对称密钥加密也叫做公开密钥加密,与对称秘钥加密相比,其安全性更好。非对称秘钥加密使用一对密钥,即公钥和私钥,且二者成对出现。私钥被自己保存,不能对外泄露。公钥指的是公共密钥,任何人都可以获得该密钥。用公钥或私钥中的其中一个进行加密,用另一个进行解密。

这种分发模式实际上是Web站点多客户端( 浏览器 )与单一服务器的网络拓扑所决定的,多客户端意味着密钥能被复制和公开获取,单一服务器意味着密钥被严格控制,只能由本服务器持有,这实际上也是后面要提到的之所以能通过数据证书确定信任主机的重要原因之一。如果我们跳出web站点的拓扑环境,其实就没有什么公钥与私钥之分了,比如,对于那些使用以密钥为身份认证的SSH主机,往往是为每一个用户单独生成一个私钥分发给他们自己保存,SSH主机会保存一份公钥,公钥私钥各有一份,都不会公开传播

非对称密钥加密 常见的算法有:RSA、Elgamal、Rabin、D-H、ECC(椭圆曲线加密算法)

// 公钥加密 私钥解密
明文 + 加密算法 + 公钥 => 密文;密文 + 解密算法 + 私钥 => 明文
// 私钥加密 公钥解密
明文 + 加密算法 + 私钥 => 密文;密文 + 解密算法 + 公钥 => 明文

数字摘要

数字摘要采用单项Hash函数将需要加密的明文“摘要”成一串固定长度(128位)的密文,这一串密文又称为数字指纹,它有固定的长度。不同的明文“摘要”成密文,其结果总是不同的,而同样的明文其“摘要”必定一致。

常用的加密算法包括 HASH(MD5 、SHA1 、SHA256)、HMAC(HmacMD5、HmacSHA1、HmacSHA256)等。

数字签名

数字签名是一个经过加密的数字摘要,用来验证报文未被伪造或篡改的一种技术。

数字签名技术就是对“ 非对称密钥加解密 ”和“ 数字摘要 ”两项技术的应用,它将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。

注:数字签名只能验证数据的完整性,数据本身是否加密不属于数字签名的控制范围

数字证书

数字证书是由CA给某网站颁发的一种认可凭证,该数字证书包括了加密后 的 服务器公钥、权威机构的信息、服务器域名,还有经过CA私钥签名之后的数字签名(经过先通过Hash函数计算得到证书数字摘要,然后用权威机构私钥加密数字摘要得到数字签名),签名计算方法以及证书对应的域名。

数字证书验证流程如下:

  • 当客户端收到数字证书之后,使用本地配置的权威机构的公钥对证书进行解密得到服务端的公钥和证书的数字签名,数字签名经过CA公钥解密得到证书信息摘要。
  • 然后根据签名计算方法计算一下当前证书的信息摘要,与收到的信息摘要作对比,如果一样,表示证书是服务器下发的,否则证书不可信任。

握手过程

  1. 浏览器向服务器的443端口发起请求,请求携带了浏览器支持的加密算法和哈希算法。
  2. 服务器接收到请求,选择浏览器支持的加密算法和哈希算法。服务器将数字证书返回给浏览器。
  3. 浏览器接收到数字证书后,进行数字证书的认证:
    1. 浏览器从内置的证书列表中索引,找到服务器下发证书对应的机构,如果没有找到,就会提示用户该证书不是由权威机构颁发,是不可信任的。如果查到了对应的机构,则取出该机构颁发的公钥。
    2. 用机构的证书公钥解密得到证书的内容和证书签名,内容包括网站的域名、网站的公钥、证书的有效期等。浏览器会先验证证书签名的合法性。
    3. 签名通过后,浏览器会验证证书记录的域名是否和当前网址一致,不一致会提示用户。如果网址一致会检查证书有效期,证书过期了也会提示用户。这些都通过认证时,浏览器就可以安全使用证书中的网站公钥了。
  4. 浏览器生成一个随机数R,并使用网站公钥对R进行加密,将加密后的随机数R传递给服务器。
  5. 服务器用自己的私钥解密得到随机数R,以R为密钥使用了对称秘钥加密算法加密网页内容并传输给浏览器。
  6. 浏览器以R为密钥使用之前约定好的解密算法获取网页内容。
我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章