zoukankan      html  css  js  c++  java
  • 关于HTTPS

    概述

    从http迈向https,安全因素是首要因素,大致讲述一下https的流程,表达有误的地方多多包涵。

    摘要算法

    摘要算法是将任意长度的文本,通过一个算法,得到一个固定长度的文本。常见的有MD5消息摘要算法及SHA家族安全散列算法。

    加密算法

    有对称加密和非对称加密。
    对称加密是在加密和解密时使用相同的密钥,常见的对称加密算法有AES、ChaCha20、3DES、Salsa20、DES、Blowfish、IDEA、RC5、RC6;对称加密的速度比公钥加密快很多。
    非对称加密,它需要两个密钥,一个是公开密钥,另一个是私有密钥;使用公钥加密后所得的密文,只能用相对应的私钥才能解密并得到原本的明文;反之,使用私钥加密所得的密文,只能通过对应的公钥才能解密并得到原本的密文。
    公钥可以公开,可任意向外发布;私钥不可以公开,必须由用户自行严格秘密保管,绝不透过任何途径向任何人提供。

    数字签名

    我们可以直接对消息进行签名,验证者用公钥正确解密消息,如果和原消息一致,则验证签名成功。但通常我们会对消息的散列值签名,因为通常散列值的长度远小于消息原文,使得效率大大提高。
    签名可以保证消息的完整性, 确认消息的发送者身份,同时发送者对发送过此消息的事实具有不可否认性。

    CA证书

    加入我要申请一个证书,我先在自己搞出来一对公钥和私钥,然后我把公钥和我想生成的证书的一些信息发给证书机构,证书机构人员会审核我的请求,如果认为我是可信的,证书机构会把我的公钥和相关信息组成证书的基本数据,且证书机构用自己的私钥对我的公钥加上数字签名,最后生成证书。
    证书一般会包括以下几部分:版本,序号,主体,发行者,有效期开始时间,有效期结束时间,公开密钥用途,公开密钥,公开密钥指纹,数字签名,主体别名。
    想要访问我的网站的人可以使用证书机构的公钥验证数字签名,如果验证成功,则可以证明公钥确实是我的,访问网站的人就可以使用证书上的我的公钥来加密明文,把密文发送网站,而我可以使用自己的私钥把密文解密,得到明文。
    在本机里,会预置一些CA机构的根证书及其他证书,可以用这些证书去验证其他下一级证书。

    HTTPS流程

    以访问https://httpbin.org/robots.txt为例,浏览器得到的结果会是

    User-agent: *
    Disallow: /deny
    

    通过抓包可以分析一下大致过程,关于wireshark如何解析https请看这篇文章。
    首先tcp三次握手,然后客户端发出server hello,此时会发出客户端支持的加密方式和一个随机数;
    服务端收到请求后,也会发送一个随机数;
    然后还会发送该网站的证书,会传输多个证书,这些证书是嵌套关系的,最小层面的就是该网站的证书。根证书会验证它下一级证书,然后直到该网站的证书,由它的上一级的公钥去验证数字签名,验证通过的话,则证明该证书就是CA机构给该网站颁发的,而且是完整的;
    证书上含有公钥信息,客户端拿到公钥后,会再生成一个随机数,然后使用公钥对该随机数进行加密,到了服务端,服务端只能用私钥进行解密,此时共产生了三个随机数,前两个随机数是明文的,最后一个随机数是加密的,而且客户端和服务端都知道这三个随机数,然后使用约定的加密算法,会得到一个用于对称加密通信的密钥,为什么又回到对称加密,因为非对称加密的资源消耗太大。
    这是通信的总过程,中间还有很多复杂的算法,可以抓包分析一下。
    通讯总过程.png

    总结

    HTTPS的安全是有信的过的机构做支撑,并不是因为有绝对安全的算法,如果中间任意一环机构出问题,那通信也不再安全。

    参考链接

    维基百科
    让面试官膜拜你的HTTPS运行流程(超详细)
    如何用 wireshark 抓包 TLS 封包
    数字签名是什么?

  • 相关阅读:
    登录验证并记录日志
    Java基础——单列
    web下载文件和跳转
    关于乱码问题的解决与HttpServletResponse中的方法
    request和response中的方法使用
    JavaEE——Servlet的Web访问名称
    JavaEE——HttpServletRequest对象
    三元表达式执行顺序 逻辑运算符的运用
    《Java多线程编程实战指南+设计模式篇》笔记
    java -jar jar包,运行报错没有主清单和无法加载主类
  • 原文地址:https://www.cnblogs.com/python-dd/p/12643167.html
Copyright © 2011-2022 走看看