先行知识补充:
- 对称加密:
首先看官方定义:用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
也就是说一段信息,用一个密码把锁住,用刚才你用来加密的密码就能把这个锁打开,这样传输信息不需要消耗太多代价。就像你在你们宿舍门上挂了一把密码锁,你设置了一个密码,你的舍友就可以用你设置的这个密码打开密码锁。
但是这个时候会出现一定的问题,假设你跟你的舍友不在一起,你把密码设置好了然后锁上,等你舍友看到这个带着密码的密码锁(接收方接收到了你加密的信息),他并不知道你设置了什么密码,他自然打不开这个密码锁,于是你想着我把我设置的密码微信告诉给舍友(把密码发送给接收方),这个时候又出现问题了,你是明文发送密码还是给密码再设置一个密码,显然明文发送的话,所有人都知道了你设置的密码,那自然不安全的,如果给密码再设置一个密码,没有密码的密码,你的舍友也解不开密码,那密码的密码你怎么告诉你舍友,显然又面临了相同的问题。所以这就是对称加密的缺陷。于是人们想到了一个非对称加密。 - 非对称加密:
如法炮制咱们先看官方定义:非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
也就是说一段信息,用一个密码加密,用另一个密码可以打开。虽然这样安全(为什么安全待会再说)但是这样代价非常大,不可能将所有的信息都用非对称加密,那既然这样,我用非对称加密把对称加密的密码发过去(反正密码很短,代价大也可以接受),再用对称加密传输正文(用非对称这种传输安全的方式把密码告诉你的舍友,然后再给你舍友发一下你上的对称加密的锁,这样就保证安全而且传输代价小)。
然后非对称加密是怎么工作的?这会借用到哈希表。不知道哈希表的可以先去看一下。首先哈希表是单向算法,在非对称加密中,私钥就相当于你的映射前的索引,公钥就是经过哈希算法映射后的信息。也就是说通过私钥可以推算出公钥,通过公钥算不出私钥。首先你要知道公钥和私钥本质上是一样的,都是用其中一个加密,用另一个可以打开,只不过私钥不公开,公钥对外公开,于是用自己的公钥加密之后,只有自己才能解开这段信息(私钥只有自己有,别人即使知道你的公钥也推断不出来你的私钥)。用自己的私钥加密信息,所有人都可以解开这段信息。(因为公钥可以解开私钥锁住的信息,即使不知道你这个私钥是什么)
https的工作过程:
-
参与成员:浏览器 服务器 globalsign(权威机构)
-
背景知识(为什么需要三个参与者):
首先交代一下背景知识,比如浏览器要访问银行网站,浏览器也想知道自己访问的是不是假冒的银行网站(别把我银行密码给骗了),这时就需要有人给银行服务器证明一下自己是正牌网站,于是银行网站先去找globalsign权威机构去在自己的证书上签个名,然后服务器再把自己的证书发送给浏览器,看,这就是我的证书里面还有权威机构签名嘞。这个时候浏览器就会相信这个服务器,才开始访问服务器。于是这里衍生出几个问题。怎么保证所有人都能识别这个证书?而且签名不被伪造?权威机构用自己的秘钥(*因为权威的秘钥只有自己知道,所以只有权威机构知道自己怎么加密的,相当于亲笔签名,别人都不知道我的字体是什么样)*把签好名的证书加密并发回给服务器,服务器再发送给浏览器,这个时候浏览器由于本身知道权威机构的公钥(本身就是公开的)用公钥就可以解开这个信息,打开一看确实有签名。(签名也不可以伪造,因为权威机构的公钥也只能打开用私钥加密过的数据)
-
传输过程:
这个时候就开始传送数据,传送的数据不是正文,而是浏览器随机生成的序列(之后用于对称加密的密码,也就是你微信发送给舍友你的门锁密码),这个随机序列自然是需要保密的,因此需要非对称加密保证安全,注意上面证书签名是私钥加密公钥解密。之前服务器给浏览器送证书的时候,顺便把服务器的公钥发过去了。此时浏览器不仅看见了证书,还知道了服务器的公钥,这个时候,浏览器把随机序列这个需要保密的数据用服务器的公钥加密,加密之后发送给服务器,服务器也就可以用自己的秘钥打开这个信息得到随机序列,(为什么要用服务器的公钥加密,因为这样加密之后只有服务器自己才能解密,即使有人拦截住信息因为不知道服务器的私钥也解不开信息)。这样浏览器和服务器双方都知道了这个随机序列,之后再用对称加密传输信息,这个对称加密使用的都是随机序列作为密码。(随机序列作为对称的密码只有浏览器和服务器知道)