https 加解密机制 - archering/basic GitHub Wiki

HTTPs加解密机制

https://tiptopsecurity.com/how-does-https-work-ssl-tls-explained/#!prettyPhoto

名词解释:HTTPS & SSL/TSL

https : Hyper Text Transfer Protocol over Secure Socket Layer

SSL: Secure Socket Layer

TSL: Transport Layer Security

https 本质上还是用http 进行数据传递,只是传递的内容进行了加密。

数据加密需要的三个基本要素:

  1. the data you want to encrypt (要加密的原始数据)
  2. A unique encryption key (唯一的加密key,通常是一个很长的随字符串)
  3. An encryption algorithm (一个加密机制,加密算法,即数学上的一套计算机制)

加密过程:一般是将 data 和 key 作为参数传递给这个算法方程,由这个方程输出cipher text(加密之后无相关的字串)

解密过程:通常意义上讲,就是只需要反向加密过程即可。这就需要你有这个key才能解密。

所以key是整个加解密过程的关键。

加密和解密过程使用同一个key的机制叫 “对称加密算法(机制)” symmetric encryption

家用wifi就是这种机密机制。 这种加密机制有个基本要求: 你能同时拥有操作加密端和解密端的能力;以wifi为例,你既能控制你的家用路由器,又能登录你的电脑,这样你在路由器上设置的密码,用你的电脑才能登录。

对称加密算法对于网站的加密就变得不切实际了,因为你无法接触别人服务器上的网站,并且share 这个加密key对于在公开的网络上也是一种风险。

非对称加密机制(asymmetric encryption)解决了这个问题; 它使用两个不同的key,一个key用来加密(public key),另一个key只能用来解密(private key)。 这种机制又叫public key cryptography 公钥密码学。

小疑惑:为什么两个不同key 能对同一数据进行加解密呢,(通俗的讲,你用a钥匙加密的锁,我用b钥匙能开); 这里就要用到数学上的 “大素数” 和 模运算。 素数是只能被1和他本身整除的数。

几个素数相乘很容易,但要对乘积结果进行因式分解是十分困难的(获取这个数是由那几个数相乘的)虽然技术上有这种可能性。

public key 个 private key 是经过同一套算法机制计算得出来的,他们是强相关的,这也就是为什么能用一对key进行加解密的原因。 非对称加密解密过程是单项的,public key只能用来加密,private key只能用来解密。

public key cryptography 公钥密码学,在实际的web加密中 使用 asymmetric encryption 和 symmetric encryption 两种加密机制。

https网站是如何一步步进行加解密的:

![img

  1. 首先你在浏览器地址栏输入网址,向服务端发起建立连接请求。
  2. 服务端收到请求后,发送给浏览器一个 public key
  3. 浏览器收到public key后先生成了一个session key,然后用public key 加密了这个session key 再发送给服务端。
  4. 服务端收到public key加密的session key包裹后,用private key 解密这个包裹拿到session key。(到这里为止,服务端和客户端都有了session key)
  5. public key的作用到此被废止。 之后服务端/ 客户端采用session key 进行对称加密 进行数据交互(服务端和客户端都有session key)。

网站的详细处理流程如下:

How-HTTPS-Works

上图说明:

public key的作用仅仅是在开头加密一个 session key的包裹给服务端,服务端一旦获的这个包裹并解密出session key后, 之后的数据交互就不再使用 asymmetric encryption(非对称加密) 机制,而是采用symmetric encryption(对称加密) 机制 只有一个key(session key)。

为什么不一直使用asymmetric encryption传递消息?:

  1. asymmetric encryption 是单向的加解密。加密的key不能用来解密数据,只能由另一个匹配的private key解密。
  2. asymmetric encryption(非对称加密)需要更多的计算资源。

下面,例子可以看出,非对称加密的key产生的字符非常长,而对称解密的key非常短。

Symmetric encryption key

AES 256-bit session key (expressed in hexadecimal)

C8D5897DCC56D6D462B8F32D464303161ACE11E536F04AE1

Asymmetric encryption key

RSA 2048-bit private key (expressed in base64)

MIIEogIBAAKCAQBl1esMuCZXUjwiBaUJsZlHrcGJ988fblnhcTjtpnaovHYp7IZW

0EMIkKMuF6tILPuJBMd2FoFHC2ZUVcmGrFabK/zRzrEb74djiH4l1gQHZDsQYybv Qm6bJEsT5Cy+lwRCvXznEnWmQu62HX09CThtXUPNwfGLcAEFQLzgKPOcU4DZboY9 Tlm/Repe9w6h0KEzB7MHFIt446RPh9FalQwfrjfxGNHb+8V9BVlpRetXxd6aj1oo WEsg5TqrZB8Cr17l/KXh+goqlyFmsz6WMpbv5oLbG+535PhyZjJ/VjiuTi6jsD9N Skgq+iEbx74ZE855Ba7iYlJma6vxAj3ILdyLAgMBAAECggEAB41BjQPq8/bJNsys XHerIkGkZJLX7UDFsY4v5o+9pO205Y8At1diYTQ4paZjsUqErLiKAhvRIm+Z+w8R jscg9QjiCr0FLUkqBRuOH0grrFCmgKSZsox+n0qltqfpGYkha8GZjZk02EuGYEL3 kpsocBPGf2+udeSsbrNKTmU7C5CdOp+Fzmw4goltgmS3Sn8FWBaWOgblcUIFyupB ETAzxUiH2qQom3plosMb11NzVNw8LajyGNmphB5szRHx+6Y6fGuhEacIePez8LJE zRUdcjomzNNsft1iAduc0cZSRfPCMMmP989l+tWck2d/i9QWtuRoDhxsXyAaCieZ dDnAIQKBgQDGrxF1WRum9N+D4D2MRTntseiNyZAKzgcPmXqyWoyPFDKsiTsk/Qe2 /KIQjJf11JcpZ+12UNNRFjghiFyl3Bh1E+pT6kzTPUZ5Ewws0hjm5CL667RkWCtn 4N4BoWPLmM5KFXMvmoK3iNyMLI+LZmI3HQ2wLcpC2+I1cpVmyQHoZQKBgQCDNotl s2tuzNOKUsgrYl3SGk3MgOHe147h/Q32/x+dahIihVz6N3/nCiVpmliySGuLlxOu OsWJby7XNuana7AVt59pE7G87pHtNFpLvhmN8oBDgvzbH2pLta/fQM9yjDokyk0I 4jhn2cMDE6qpx1yLnR8Hogb393GXqmAB/RtKLwKBgCF1yE3n9NU4NhBCinr+CZRz OsPuJxj6u4uwAE7bGwLZlvMhpVlEV7FEeJKq6siWxeJOQ1qCoCPuxwM2sMup9mB5 OyRouAl3L1AimhFOTK1NzGpPmbCwfJbg8uJ5aJIYKN2nIR/qOItqPCJLOt1yH6ZC eVSrUX3TBBSWOHz36x9VAoGAPyB8zD8XzsTIeWH+X7EBhlWVXHAdOwLmAR+oGk7/ vNINS4JyCwesh1FAUqApUAy7gPr8QvSPmOFe3bfSHHYYzzn6fak197mnh0GKt6oL zVkAEHryf9GLaEVPCc+6flesmYqiqUV88am4wsAxeWEqyxialyeCxsXLZrZXXl2R RY0CgYEAioZF15++gWnRzVKL/xFMj6Si53hekXHMrAsyYkxDB7Drjz3Qg9QN7fG1 gzBXLeRPa0tnkfcWgeXIdbHNZywfqrhaUO+k4t5Ei5n8ZXDKeqtNAGSrVdG282/a OXL64xujKmZG27kZjK43bRe27obUHXbV7X0unT98QyYyWmkXdKk=

https没有做的工作:

  1. 没有隐藏网站的域名
  2. https加密的网站并不能保证你访问的网站没有病毒,没设置陷阱
  3. 你访问网站时用的ip地址不在数据加密的范围内

https 网站的TSL 四次握手(你需要先了解上面的加解密机制)

  1. 首先你在浏览器输入网站地址发送连接请求。 (这个过程会一并将客户端支持的加密算法,sessionID,hash 发送到服务端)
  2. 服务端(网站)从客户端发来的信息中,选择一组加密算法和hash算法,然后将这些信息和public key ,

​ 网站地址,颁发证书的机构等包装成一个证书发送给客户端。

  1. 客户端获得证书后,首先验证证书的合法性(查询颁发证书的机构是否合法,证书中的网址是否与访问地址一致,证书是否过期,证书是否在吊销的名单中)
  2. 如果证书不合法会出现提示,阻止继续往下执行。 如果证书合法 则会用hash算法计算握手消息生成session key。 最后用public key 加密这个session key 传递给服务端。
  3. 服务端获得客户端传来的数据包后,先用private key 解密这个数据包,拿到session key 和 hash,然后验证hash和浏览器传过来hash(第一步)是否一致。
  4. 如果一致,握手结束,之后的数据通信采用session key加密的对称加密算法。