zoukankan      html  css  js  c++  java
  • 深入理解http(三)----http进阶hhtps

    一、https概述

    https=http+SSL/TSL

    在http中,没有加密机制,所有的内容都以明文的形式传输,在网络上“裸奔”,这是极其不安全的,为了解决这个问题,可以通过SSL(Secure Socket Layer安全套接层)或者TSL(Transport Layer Security安全车传输协议)的组合使用,达到加密http的通信内容,这个时候,http就变成了https协议。

    二、加密方式

    通过前面的概述,我们知道,SSL/TSL最主要的作用就是用来加密信息。但他们加密的方式是什么呢?

      1.对称加密的方式:对称加密就是说:加密使用的密钥和解密使用的密钥是相同的。比如,我们在手机加锁时,解密的密码和加锁的密码是一样的。我们很容易想到,对称加密存在很大的安全隐患,万一你的手机密码不小心泄漏了,那么手机在任何人手里都可以使用,完全不存在隐私。

      2.非对称加密。 (https://segmentfault.com/a/1190000004461428) 

      非对称加密是一种比对称加密更加优秀的加密算法,当然算法有利有弊,对称加密速度快但是安全性相对于非对称加密来说低,为什么呢,你想啊,要想使用对称加密,那么分享信息的各个个体之间都需要分享这个密钥,比如你们1000个人之间都使用同一个密钥进行密文传输,只要其中一个人密钥被盗窃了,那么整体加密的信息将都被破解了。好了,那么我们开始说说非对称加密。
       

    三、非对称加密方法(http://www.cnblogs.com/mujian/p/7665958.html)
    1公钥私钥的使用原则
    ①每一个公钥都对应一个私钥。 
    ②密钥对中,让大家都知道的是公钥,不告诉大家,只有自己知道的,是私钥。 ③如果用其中一个密钥加密数据,则只有对应的那个密钥才可以解密。
    ④如果用其中一个密钥可以进行解密数据,则该数据必然是对应的那个密钥进行的加密。

    非对称密钥密码的主要应用就是公钥加密和公钥认证。
    2公钥加密、解密
    加密的目的,是不希望第三者看到当前两个通讯用户的通讯内容。

    2.1加密
    A(客户)想给B(服务器)发送一段文字,但是不想让别人看到,因此想使用非对称加密方法来加密这段文字,当然,B需要有一对公钥和私钥:
    ① B将他的公钥发送给A
    ② A用B给他的公钥加密这段文字,然后传给B
    ③ B用他的私钥解密A发过来的消息,这里要强调的是,只要B的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。
    通过这几步,B就能成功收到A发送的信息,同时又达到了保密的目的。

    2.2解密
    如果B想给A回信息,就简单的多了:
    ① B将要回复的信息通过自己的私钥加密,然后传送给A
    ② A用B之前给他的公钥解出这份信息。

     
     
    数字签名
    3、公钥认证
    在2公钥加密、解密里面描述的通讯过程看似简单,但想想这个问题:在过程2中,A怎么B给他的回信在传递过程中,有没有被人修改?这就涉及到数字签名的概念。

    3.1数字签名(digital signature)
    微软官方给出的定义:“数字签名”是指可以添加到文件的电子安全标记。使用它可以验证文件的发行者以及帮助验证文件自被数字签名后是否发生更改。

    3.1.1数字签名原理
    要达到这个目的,一般是对信息做一个hash计算得到一个hash值,注意,这个过程是不可逆的,也就是说无法通过hash值得出原来的信息内容。在把信息发送出去时,把这个hash值加密后做为一个签名和信息一起发出去。 接收方在收到信息后,会重新计算信息的hash值,并和信息所附带的hash值(解密后)进行对比,如果一致,就说明信息的内容没有被修改过,因为这里hash计算可以保证不同的内容一定会得到不同的hash值,所以只要内容一被修改,根据信息内容计算的hash值就会变化。当然,不怀好意的人也可以修改信息内容的同时也修改hash值,从而让它们可以相匹配,为了防止这种情况,hash值一般都会加密后(也就是签名)再和信息一起发送。

    3.1.2数字签名使用方式
    下面通过例子来说明这个过程:
    B给A回信时,采用了数字签名的方式
    1、B先用hash函数,生成信件的摘要(digest)
    2、B使用自己的私钥,对这个摘要加密,这样就生成了数字签名(signature)
    3、B将这个签名附在要回复的信息后面,一起发给A
    4、A收到B的信息后,取下数字签名,并通过B的公钥解密,得到信件的摘要信息
    5、A在对B发送的信息本身使用B指定的hash函数,将得到的结果同上一步解密得到的摘要进行对比,如果两者一致,就说明B发过来的信息未被修改过。
     
    数字签名形成过程如下图:

    数字证书

       虽然A确定了B回给他的信息是未修改过的,但是怎么确定给他回信息的就是B?如果有不怀好意的C把A保存的B的公钥偷偷换成自己的,并冒用B的名义给A发信息呢?
    要解决这个问题,A只要能确定自己持有的公钥到底是不是B的就行了,这就需要用到数字证书。
      数字证书是用来验证公钥所属的用户身份。在日常生活中,如果我们要验证一个人的身份,通常的做法是查看他的身份证。我们信任身份证颁发机构即政府机构的公信力,因此只要验证一个人的身份证不是伪造的,我们就相信这个人的身份和身份证上所描述的是一致的。
      数字证书就是一个人或者组织在网络世界中的身份证,其发证机关是证书管理机构(certificate authority,CA)。CA用自己的私钥对用户的身份信息(主要是用户名和该用户的公钥)进行签名,该签名和用户的身份信息一起就形成了证书。
     
    数字证书的构成
      
    · 证书的发布机构(Issuer)
      指出是什么机构发布的这个证书,也就是指明这个证书是哪个证书中心(certificate authority,简称CA)发布的的(只是创建证书,不是指证书的使用者)。
    · 证书的有效期(Valid from , Valid to)
      也就是证书的有效时间,或者说证书的使用期限。 过了有效期限,证书就会作废,不能使用了。
    · 公钥 (Public key)
      这个我们在前面介绍公钥密码体制时介绍过,公钥是用来对消息进行加密解密的,是很长的一串数字。
    · 证书所有者(Subject)
      这个证书是发布给谁的,或者说证书的所有者,一般是某个人或者某个公司名称、机构的名称、公司网站的网址等。
    · 签名所使用的算法 (Signature algorithm)
      指的这个数字证书的数字签名所使用的加密算法,这样就可以使用证书发布机构的证书里面的公钥,根据这个算法对指纹进行解密。指纹的加密结果就是数字签名
    · 指纹以及指纹算法 (Thumbprint, Thumbprint algorithm)
      这个是用来保证证书的完整性的,也就是说确保证书没有被修改过。 其原理就是在发布证书时,发布者根据指纹算法(一个hash算法)计算整个证书的hash值(指纹)并和证书放在一起,使用者在打开证书时,自己也根据指纹算法计算一下证书的hash值(指纹),如果和刚开始的值对得上,就说明证书没有被修改过,因为证书的内容被修改后,根据证书的内容计算的出的hash值(指纹)是会变化的。

    数字证书的生成过程
     
    数字证书原理
    有了数字证书以后,A和想跟B通信,就可以通过B的数字证书来获取B的公钥,以达到验证自己手中的公钥到底是不是B的目的。过程是这样的:
    1、B给A回信的时候,在信息后面附上了自己的数字证书
    2、A收到B的回信以后,会取出附带的数字证书,并读取证书中的发布机构(Issuer),然后从操作系统的受信任证书机构列表中查找该证书办发机构的公钥,如果找不到,说明这个证书颁发机构是个不受信任的,B发过来的信息当然也是不安全的
    3、使用上一步取到的证书颁发机构的公钥,解出数字证书,得到可能是B的用户信息和数字签名
    4、A通过证书中指定的加密算法对可能是B的用户信息进行hash加密
    5、加密后的结果和证书中解出的数字签名进行对比,如果相同,就说明这份用户信息确实是B的,也就是说用户信息中包含的公钥确实是B的
    这样就验证了B身份的真实性。
    下图很形象的表示了这个过程:
     
    证书发布中心(CA)的公钥的嵌套验证
    这里有一个有趣的问题,用户A使用证书机构的公钥来验证用户B的数字证书,但如果A和B使用的证书认证中心(CA)不同怎么办呢?由于证书认证中心可以通过另外一个更高级别的认证中心对该证书机构的公钥颁发一个证书,这样形成了一个公钥证书的嵌套循环,该循环的终点就是根证书机构。根证书机构较少,其公钥可以通过安全的方式发布,如通过USB拷贝、书面文件当面移交。如此依赖,A就必须从B的CA的树形结构底部开始,从底层CA往上层CA查询,一直到找到共同的信任CA为止。
    整个过程如下图所示:
     

     

    个人理解:数字签名用来保障信息不被修改,数字证书用来明确用户的身份。





    在我身后,微笑地活下去吧。
  • 相关阅读:
    2019年4月
    20190423
    20190419
    20190418
    20190417
    free命令详解(转载)
    https改造过程中的一个坑
    GitLab 实现代码自动部署(转载自https://segmentfault.com/a/1190000011561808)
    js和php写日历
    shell递归遍历目录的方法
  • 原文地址:https://www.cnblogs.com/L-C98/p/9183724.html
Copyright © 2011-2022 走看看