zoukankan      html  css  js  c++  java
  • 白话HTTPS加密机制

    在讲主题之前,我们先来理解两个概念:签名和加密

    我们从字面意思看:

    • 签名就是一个人对文件签署自己的名字,证明这个文件是我写的或者我认可的,所以只要别人看到我的签名,就知道这个文件确实是可以信任的,如果文件没有我的签名,或者签名不对,说明文件可能被改动了,不可信。在网络安全中,签名一般对应数字签名,它可以根据文件内容生成独特的签名字符串,从而防止文件篡改。

    • 加密就比较简单了,使内容不可阅读,只有通过一定的规则进行才能解密。

    为什么要讲这两个东西呢?因为这两个概念在HTTPS加密过程中是很重要的概念,他们解决了安全传输中的两个重要问题:

    • 保证信息在传输过程中无法被阅读
    • 保证信息不被篡改

    正题

    为了生动的讲述加密过程,我们利用一段角色故事来说明:

    故事里有三个角色:分别是小红A,小强B,和小贱C.

    小红A代表服务器,小强B代表客户端,小贱C代表中间劫持者。以下用ABC简称。

    故事是这样的:小红和小强是同班同学,互相爱慕,但两个人的座位中间隔着小贱C。为了互相“表达感情”只能通过扔纸条的方式把信息传递给对方。而C特别好奇,就老想在中间把纸条拦截下来偷看,显然A和B是不愿意的,所以他们要想出一个办法,既要实现二者的沟通,又要实现信息的“保密”。

    他们想到了以下几种方案:

    方案1:

    A和B用一套相同的规则对消息进行加密和解密,这套规则需要一个字符串x作为密钥来加密和解密,这样C不知道x的话即使截获到了消息也看不懂内容。

    这套方案就是对称加密方案,对称加密方案效率高,但是有个很大的缺陷:A和B怎么商定这个x呢?第一次传递的时候明文把x传递给对方吗?显然不行,因为可能被C截获到,这样C也能解密消息了。

    这个时候,人们发明了一种神奇的盒子,这个盒子可以实现只有拥有者可以解开这个盒子,别人只能往里塞信息,却打不开,看不到里面装了啥,A和B正犯愁呢,听说这个神奇的盒子后,想出了一套新的方案:

    方案2:

    A和B都拿了个黑盒子,他们互相把自己的黑盒子扔给对方,然后彼此把消息放到黑盒子里,扔回去,然后A和B从盒子里拿出对方发送的消息。这样就解决安全问题了,但是有个很大的缺点,就是每条信息两个人都要向黑盒子里塞东西,这个过程太麻烦了,效率很低,于是AB又开始发愁了。

    方案二是用的纯非对称加密的方法,其中黑盒子就是非对称加密的公钥,往盒子里扔东西就是用这段公钥对信息加密的过程,之后带有信息的黑盒子只有利用私钥才能解开。

    故事里往黑盒子里塞东西的过程很“麻烦”,其实就是非对称加密缺点,计算量大,使得效率降低,因此HTTPS也没有采用这个方案。那么有没有更好的方案呢?当然有~,我们看方案1,其实最大的问题就是密钥x的商讨问题,即A和B怎么互相确定对称加密密钥x,而且还不能明文传输让别人知道,于是有第三套方案

    方案3:

    A这样操作:给B扔一个黑盒子,B拿到盒子以后,往里放一段随机生成的密钥x,扔回了A。这个过程即是被C截获了,C也拿不到盒子内部的东西,所以是安全的。之后A从盒子里把B给他的密钥拿出来,然后他们就用这段密钥x通过方法1的方式沟通了。

    该方法就是现在HTTPS的加密方法,利用的非对称加密+对称加密的方式结合的方式,非对称加密传递确认对称加密的密钥x,之后完全用对称加密传送信息。

    那么这套方案就没有漏洞了吗?聪明的C又想出来一个办法:在截获A给B黑盒子时,他也买了一个黑盒子,把这个A给的黑盒子替换成自己的盒子,给了B,B拿到“假盒子”后,把密钥x放了进去,C又截获了这个带有x的黑盒子,因为是自己买的黑盒子,当然能解开了,所以就拿到了密钥x。然后他把x放进A的真盒子,扔给了A,这时A不知道发生了什么,使用盒子里的x作为后续交流的密钥,跟B进行后续的沟通。而其实,C早就知道他俩的密码了,随时都可以拿到消息进行解密。

    因此,这套方案唯一的问题就是:B怎么知道它拿到的黑盒子就是A给的??现实中,盒子就是一个公钥,只是一个字符串,怎么知道这个字符串就是网站的呢?这个问题确实难倒了A,她想在现实生活中寻找答案:我快递给了别人一个号码,怎么证明这个号码是我的,而且中间没有人改过?她突然想起了自己的身份证,身份证号码是一个人的唯一标识,当我告诉别人我的身份证号码时,别人怎么相信的这个号码是我的?给他身份证看!小红感觉灵感来了,她接着想,别人为什么看到身份证就相信了呢?很简单,身份证上有我的名字,有我的ID,最重要的,身份证是公安局发的,别人伪造不了!于是小红想出了一套解决方案,方案的关键就是去“公安局”制作一套“公钥身份证”。
    其实现实中的HTTPS,正是采用了小红的方案,身份证号码可以类比网站公钥,身份证姓名头像可以类比网站域名等相关信息,我们来看详细的解决过程:

    如何证明客户端收到的公钥是该网站的公钥

    HTTPS采用的类似于身份证的方法,所有用HTTPS的网站都要有一个“公信”机构颁发的证书,证书就像一个身份证一样,客户端可以对其进行真实有效性判断。而这个公信机构就是CA,身份证的防伪手段采用的就是数字签名,后面会详细阐述。我们以小红把身份证寄给小强为例:这个过程分为四步:

    1. 小红把去公安局制作印有公钥信息的“身份证”。
    2. 把身份证寄给小强。
    3. 小强拿到身份证,验证身份证真伪,
    4. 身份证是真的还不够,因为小贱也可以去公安局做“身份证”,把小红的快递调包。所以小强还要看身份证内容,比如看名字,头像是不是小红。

    以上四步完成以后,后续操作同方案3:小强从身份证上读取公钥,利用该公钥对随机数X加密,blabla...

    我们依次看这四步对应到HTTPS中是怎么实现的。

    1. 制作“身份证”:制作机构是国际组织CA,它负责颁发给申请者一份证书。证书包含两部分,内容和签名,内容就像身份证上的身份证号,姓名等,签名就像身份证的防伪手段一样,防止证书内容被篡改。CA利用非对称加密制作签名,它先将明文的证书内容进行hash,然后对hash值利用私钥加密生成签名,最后把签名和内容一块发给网站,就是网站的证书。至于证书怎么防伪的,在小强验证的时候会详细说明。
    2. 寄快递:自然是通过网络传输,服务端把证书传递给客户端。注意,原来方案三传输的是明文的公钥,现在公钥写在了证书上,传输的是证书。
    3. 小强收到快递,验证真伪:如何验证呢?之前说到,CA制作签名时用的私钥,而客户端都有CA的公钥(是的,操作系统,浏览器等都存有CA的证书,可以拿到其公钥),用公钥对证书签名解密得到一段字符串,拿它跟证书内容的hash值对比,如果相同,则说明证书是可靠真实的。为什么呢?试想,第三方截获内容,把内容修改了,比如把证书内容里的域名从www.baidu.com改成了www.google.com,但是因为第三方没有CA的私钥,所以没法将改动后的内容进行加密,如果用错误的密钥加密,用户验证的时候签名是对不上的,因此第三方是改不了证书内容的。也就是说,一个网站在全世界只有这一份唯一的证书,永远没有人能改动它,只要改了,就能被识破。整个过程可以借用网上的一个图片来解释,见文末。
    4. 读取身份证内容:很简单,看证书内容就可以了,证书的内容里包含了网站的域名等信息,如果第三方攻击者把整个证书文件更改了(包括签名和内容),比如上面的百度变谷歌,客户端本来想跟百度交流的,但看到内容里写的是谷歌,就拒绝跟它沟通,就像你拿到了张三给的身份证,但是上面写着王五,当然你就不理他了!

    注意,有个地方容易混淆,即加密过程牵扯到了两对公私钥:CA对证书的加密私钥对应客户端早以安装的CA解密公钥;客户端对X加密的公钥和服务端对X解密的私钥。其中X即上文中写的对称加密的密钥,整个过程客户端用了两个公钥,CA和服务端各有一个私钥。

    最后用通俗的话总结这个过程:小红向公安局申请身份证,身份证上写着她的名字以及她跟小强交流用的公钥,公安局制作完毕后给小红,小红拿着身份证寄给了小强,之后小强通过上面的防伪标志和姓名确认了其真伪和正确,用上面的公钥给随机生成的x加密,还给了小红,小红拿着自己的私钥解出了x,二者用x愉快的交流起来~~~

    以上就是HTTPS加密的原理浅析,有漏洞之处,欢迎指出~

    image

  • 相关阅读:
    神奇的C语言
    实现代码编辑器
    实现了一个简单的key-value存储系统
    一些官网说明
    苹果用户转入mate30,被恶心到了
    吐嘈一下乱用注入
    谈一下OOP的乱用现象
    mongo3.x ssl版安装文件
    再谈LRU双链表内存管理
    cocos在win平台exe无法使用 UserDefault 解决方法
  • 原文地址:https://www.cnblogs.com/jymblog/p/11646766.html
Copyright © 2011-2022 走看看