zoukankan      html  css  js  c++  java
  • HTTPS原理分析

    一、HTTPS的实现原理

    1. 对称加密

    A与B之间的通讯数据都用同一套密钥来进行加密解密。

    • 优点

      简单快捷,密钥较短,且破译困难。

    • 缺点

      如果用户一旦过多的话,管理密钥也是一种困难。不方便直接沟通的两个用户之间怎么确定密钥也需要考虑,这其中就会有密钥泄露的风险,以及存在更换密钥的要求

    2. 非对称加密

    用公钥和私钥来加解密的算法。例如,A的公钥加密过的东西只能通过A的私钥来解密;同理,A 的私钥加密过的东西只能通过 A 的公钥来解密。顾名思义,公钥是公开的,别人可以获取的到;私钥是私有的,只能自己拥有。

    • 优点

      比对称加密安全

    • 缺点

      加解密比对称加密耗时

    但是非对称加密也是存在漏洞,因为公钥是公开的,如果有 C 冒充 B 的身份利用 A 的公钥给 A 发消息,这样就乱套了,所以接下来就采用非对称加密+摘要算法+数字签名的机制来确保传输安全。

    常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)Hash算法(摘要算法)

    Hash算法(摘要算法)

    Hash算法的特点是单向不可还原,用户可以通过hash算法对目标信息生成一段特定长度的唯一hash值,却不能通过这个hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。只要源数据不同,算法得到的摘要必定不同

    常见的Hash算法有MD2、MD4、MD5、HAVAL、SHA

    数字签名
    数字签名用来,保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。
    数字签名是 A将原始明文通过 hash 算法得到摘要,这个摘要是不可逆的;将明文加密,连同摘要一起发送给B;B接收到后解密,得到这个摘要 a 和加密的明文,再将加密明文解密得到原始明文,然后通过同一 hash 算法得到新的摘要 b,比较 ab 就可得知在传输过程中是否被更改过。
    因此数字签名能够验证信息的完整性。如果中途数据被纂改或者丢失。那么对方就可以根据数字签名来辨别是否是来自对方的第一手信息数据。
     
    数字证书
    首先有一个权威的证书签发机构称为CA,证书中包含的信息有:颁发机构信息、公钥、公司信息、域名、有效期等,然后签发机构根据指纹算法(一个hash算法)计算整个证书的hash值(指纹),  签发机构再通过私钥加密整个证书的hash值,得到签名信息,然后将明文证书与签名信息连成一个文件,这个文件就是所谓的数字证书
     
    验证数字证书
    例如我们"ABC Company"申请到这个证书后,我们把证书投入使用,我们在通信过程开始时会把证书发给对方,对方如何检查这个证书的确是合法的并且是我们"ABC Company"公司的证书呢?首先应用程序(对方通信用的程序,例如IE、chorme等)读取证书中的发布机构为"SecureTrust CA" ,然后会在操作系统中受信任的发布机构的证书中去找"SecureTrust CA"的证书,如果找不到,那说明证书的发布机构是个水货发布机构,证书可能有问题,程序会给出一个错误信息。 如果在系统中找到了"SecureTrust CA"的证书,那么应用程序就会从证书中取出"SecureTrust CA"的公钥,然后对我们"ABC Company"公司的证书里面的指纹和指纹算法用这个公钥进行解密,然后使用这个指纹算法计算"ABC Company"证书的指纹,将这个计算的指纹与放在证书中的指纹对比,如果一致,说明"ABC Company"的证书肯定没有被修改过并且证书是"SecureTrust CA" 发布的,证书中的公钥肯定是"ABC Company"的。对方然后就可以放心的使用这个公钥和我们"ABC Company"进行通信了。
     
     
    HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。
    HTTPS在整体过程分为证书验证和数据传输阶段,具体的交互过程如下:

    SSL协议通信过程

    (1) 浏览器发送一个连接请求给服务器;服务器将自己的证书(包含服务器公钥S_PuKey)、对称加密算法种类及其他相关信息返回客户端;

    (2) 客户端浏览器检查服务器传送到CA证书是否由自己信赖的CA中心签发。

    (3) 客户端浏览器比较证书里的信息,如证书有效期、服务器域名和公钥S_PK,与服务器传回的信息是否一致,如果一致,则浏览器完成对服务器的身份认证。

    (4) 并选择一个通话密钥key,接着用服务器公钥S_PuKey加密后发送给服务器;

    (5) 服务器接收到的浏览器传送到消息,用私钥S_PrKey解密,获得通话密钥key。

    (6) 接下来的数据传输都使用该对称密钥key进行加密。

     
  • 相关阅读:
    Java实现 LeetCode 50 Pow(x,n)
    Java实现 LeetCode 50 Pow(x,n)
    Java实现 LeetCode 49 字母异位词分组
    Java实现 LeetCode 49 字母异位词分组
    Java实现 LeetCode 49 字母异位词分组
    Java实现 LeetCode 48 旋转图像
    Java实现 LeetCode 48 旋转图像
    Java实现 LeetCode 48 旋转图像
    Java实现 LeetCode 47 全排列 II(二)
    Java实现 LeetCode 47 全排列 II(二)
  • 原文地址:https://www.cnblogs.com/cjsword/p/12902991.html
Copyright © 2011-2022 走看看