你们都知道,在客户端与服务器数据传输的过程当中,http协议的传输是不安全的,也就是通常状况下http是明文传输的。但https协议的数据传输是安全的,也就是说https数据的传输是通过加密。算法
在客户端与服务器这两个彻底没有见过面的陌生人交流中,https是如何保证数据传输的安全性的呢?安全
下面我将带你们一步步了解https是如何加密才得以保证数据传输的安全性的。咱们先把客户端称为小客,服务器称为小服。而后一步步探索在小客与小服的交流中(就是一方请求一方响应),https是如何保证他们的交流不会被中间人窃听的。服务器
假如如今小客与小服要进行一次私密的对话,他们不但愿此次对话内容被其余外人知道。但是,咱们平时的数据传输过程当中又是明文传输的,万一被某个黑客把他们的对话内容给窃取了,那就难受了。网络
为了解决这个问题,小服这家伙想到了一个方法来加密数据,让黑客看不到具体的内容。该方法是这样子的:加密
在每次数据传输以前,小服会先传输小客一把密钥,而后小服在以后给小客发消息的过程当中,会用这把密钥对这些消息进行加密。小客在收到这些消息后,会用以前小服给的那把密钥对这些消息进行解密,这样,小客就能获得密文里面真正的数据了。若是小客要给小服发消息,也一样用这把密钥来对消息进行加密,小服收到后也用这把密钥进行解密。 这样,就保证了数据传输的安全性。如图所示:3d
这时,小服想着本身的策咯,仍是挺得意的。日志
但是,这时候问题来了。这个策略安全的前提是,小客拥有小服的那把密钥。可问题是,小服是以明文的方式把这把密钥传输给小客的,这个时候,若是黑客截取了这把密钥,那就难受了。小服与小客就算是加密了内容,在截取了密钥的黑客老哥眼里,这和明文没啥区别。cdn
小服仍是挺聪明的,得意了一会以后,小服意识到了密钥会被截取这个问题。倔强的小服又想到了另一种方法:用非对称加密的方法来加密数据。该方法是这样的:blog
小服和小客都拥有两把钥匙,一把钥匙的公开的(全世界都知道也不要紧),称之为公钥;而另外一把钥匙是保密(也就是只有本身才知道),称之为私钥。而且,用公钥加密的数据,只有对应的私钥才能解密;用私钥加密的数据,只有对应的公钥才能解密。it
因此在传输数据的过程当中,小服在给小客传输数据的过程当中,会用小客给他的公钥进行加密,而后小客收到后,再用本身的私钥进行解密。小客给小服发消息的时候,也同样会用小服给他的公钥进行加密,而后小服再用本身的私钥进行解密。 这样,数据就能安全着到达双方。如图:
想着这么复杂的策略都能想出来,小服但是得意的不能在得意了…..
看着那么得意的小服,小客这时心情就不得好了。还没等小服得意多久,小客就给它泼了一波冷水了。
小客严肃着说:其实,你的这种方法也不是那么的安全啊。仍是存在被黑客截取的危险啊。例如:
你在给我传输公钥的过程当中,若是黑客截取了你的公钥,而且拿着本身的公钥来冒充你的公钥来发给我。我收到公钥以后,会用公钥进行加密传输(这时用的公钥其实是黑客的公钥)。黑客截取了加密的消息以后,能够用他本身的私钥来进行解密来获取消息内容。而后在用你(小服)的公钥来对消息进行加密,以后再发给你(小服)。 这样子,咱们的对话内容仍是被黑客给截取了啊。(倒过来小客给小服传输公钥的时候也同样)。
我靠,这么精妙的想法竟然也不行,小服这波,满脸无神。
插讲下
其实在传输数据的过程当中,在速度上用对称加密的方法会比非对称加密的方法快不少。因此在传输数据的时候,通常不仅仅只用非对称加密这种方法(咱们先假设非对称密码这种方法很安全),而是会用非对称加密 + 对称加密这两种结合的方法。 你想啊,对于对称加密这种方法来讲,之因此不安全是由于密钥在传输的过程当中,被别人知道了。基于这个,咱们能够用非对称加密方法来安全着传输密钥,以后在用对称加密的方法来传输消息内容(固然,我这里假定了非对称加密传输是安全的,下面会讲如何使之安全)。
咱们回头想一下,是什么缘由致使非对称加密这种方法的不安全性呢?它和对称加密方法的不安全性不一样。非对称加密之因此不安全,是由于小客收到了公钥以后,没法肯定这把公钥是否真的是小服。
也就是说,咱们须要找到一种策略来证实这把公钥就是小服的,而不是别人冒充的。
为了解决这个问题,小服和小客经过绞尽脑汁想出了一种终极策略:数字证书:
咱们须要找到一个拥有公信力、你们都承认的认证中心(CA)
小服再给小客发公钥的过程当中,会把公钥以及小服的我的信息经过Hash算法生成消息摘要。如图:
为了防止摘要被人调换,小服还会用CA提供的私钥对消息摘要进行加密来造成数字签名。如图:
而且,最后还会把原来没Hash算法以前的信息和数字签名合并在一块儿,造成数字证书。如图:
当小客拿到这份数字证书以后,就会用CA提供的公钥来对数字证书里面的数字签名进行解密获得消息摘要,而后对数字证书里面小服的公钥和我的信息进行Hash获得另外一份消息摘要,而后把两份消息摘要进行对比,若是同样,则证实这些东西确实是小服的,不然就不是。如图:
这时可能有人会有疑问,CA的公钥是怎么拿给小客的呢?小服又怎么有CA的私钥呢?其实,(有些)服务器在一开始就向认证中心申请了这些证书,而客户端里,也会内置这些证书。如图(此图来元阮一峰的网络日志)
当客户端收到服务器返回来的数据时,就会在内置的证书列表里,查看是否有有解开该数字证书的公钥,若是有则…..不然…..
讲到这里,就大概结束了。但愿对你有所帮助勒。若是有哪里写得不对的地方,欢迎你们指出。