Google的一份网络上的 HTTPS 加密透明报告(数据截至2022年1月)中指出HTTPS 连接的普及率在过去几年激增,互联网上排名前 100 位的非 Google 网站HTTPS 使用情况为:97%的站点默认启用HTTPS,100%的站点支持HTTPS。

Chrome 中的 HTTPS 浏览时间所占的百分比(按平台)

Chrome 中通过 HTTPS 加载的网页所占的百分比(按国家/地区)


如此流行的HTTPS我们应当对其有所了解,通过阅读本文你可能能更进一步了解HTTPS相关的安全实现。

HTTPS(超文本传输安全协议)使用HTTP进行通信,但利用SSL/TLS来加密数据包,所以它也有另外一种称呼HTTP over TLS/SSL,说HTTPS安全其实说的就是TLS/SSL协议。HTTP以明文的方式在网络中交换数据,攻击者可以轻易通过监听或中间人攻击等手段,获取网站帐户和敏感信息等,而HTTPS可以做到如下几个特性:

  • 保密性。 客户端的连接被加密,隐藏了 URL、cookie 和其他敏感元数据。
  • **真实性。 ** 确保客户端正在与“真实”的服务端通信,而非中间人。
  • 准确性。 客户端与服务端之间发送的数据没有被篡改。

保密性--对称加密、非对称加密


我们说http是明文传输,所以https首要解决的问题就是它的通信加密,达到保密性。

对称加密

对称加密是最简单、最常见的加密方式。

通信双方持有相同的密钥key,加密和解密都是使用同一个密钥。当客户端要发送数据时先用key对数据进行加密生成secret data,接着传输到服务端。服务端接收数据时,通过key将数据解密为data。反之客户端接收数据也是如此。

这样即使数据被截获,由于不知道key数据也无法被解密。常见的对称加密算法有 DES、 AES 等。对称加密速度快、效率高,能够使用较小的计算量完成加密。

对称加密有一个核心问题是如何在互联网上传输密钥?它不能像现实中一样我打个车就过去你家把密钥塞给你,万一密钥被截胡了不就白搭了。所以需要非对称加密来解决这个问题。

非对称加密

非对称加密就是加密和解密使用两个不同的密钥,密钥对包含一个公钥(public key)和一个私钥(private key)。其中公钥只能用于加密,私钥只用于解密。

首先客户端请求服务端,服务端将自己的公钥返回,客户端拿到公钥后就可以用它来加密要传输的数据data ,将加密数据secret data发送到服务端后通过服务端的私钥来解密,以此完成加密传输。

有了非对称加密,只要我们将其中的data换成随机码key,这个key作为对称加密中密钥。密钥传输问题就解决了,同时很好地利用了对称加密的高效率。

如下所示:

这样HTTPS中通信的数据加密已经完成了。

一个http请求:

一个加密的https请求:

只要我们的私钥不被破解,即使通信被监听也得不到其中的敏感加密数据。

真实性、准确性--数字证书、签名


上面我们忽略了一个重要的问题,在通信中如何保证所连接的服务端真实性呢?如下图我们的通信已经被中间人截胡了,client此时通信对象为hacker。

在HTTPS中是如何防止这种中间人攻击的呢?让我们请出数字证书!

数字证书

所谓证书就是第三方(自签证书没有公证效应)颁发的认证,比如我们的学位证是由教育局颁发的一种学历认证,由教育局来认证此人获得了某个学位。同样在HTTPS中存在一种认证机构即CA(Certification Authority),由它来证明你所连接的服务端就是你想要连接的server,即保证服务端真实性。

要获取学位证你需要花钱上学、学习,而获取数字证书你只需要花钱。

  1. 首先站点的所有者生成一个密钥对,然后掏钱将站点的信息如域名、组织信息等以及公钥提交给CA机构审核,即证书签名请求 (CSR)
  2. CA机构审核通过后,用它独有的私钥对CSR信息(其实是CSR信息的hash值,用于加速加、解密)进行加密,即形成数字签名,用于验证证书是否被篡改,经过签名后一个完整的数字证书就成了其中包含站点信息、数字签名。

如下图所示(图源:what-is-a-certificate-authority):

ok,申请到了数字证书,给安装到server中。

  • 当client请求时server返回数字证书,先查看证书认证的域名或所有者是谁?如果与你访问的域名不一致毫无疑问你正遭受中间人攻击,这是一个假站点请停止访问。

  • 如果一致,接着client查看证书的签发CA机构是谁?找到浏览器或操作系统中对应的内置CA公钥,找不到?对不起,这个站点不安全(这其实也是垄断和付费的根源),如果找到则使用公钥解密签名得到hash值和此时证书中CSR信息的hash值做对比,如果一致,则这个证书没有被修改,你访问的站点很安全,取出证书中公钥来做加密通信吧。

如下图所示:

HTTPS不保护的信息?


  • 虽然 HTTPS 对整个 HTTP 请求和响应进行加密,但 DNS 解析和连接监听仍然可以获得一些其他信息,例如完整的域名或子域以及原始 IP 地址。

  • 别有用心者还可能通过分析加密的 HTTPS 流量以获取特殊信息比如在网站上花费的时间,或用户数据包相对大小。

攻击 HTTPS 连接的有多难?


对 HTTPS 连接的攻击通常分为 3 类:

  • 通过密码分析或其他协议的弱点破坏 HTTPS 连接的质量。
  • 黑掉客户端,将恶意根证书安装到系统或浏览器信任库中。
  • 获得浏览器信任的“流氓”证书,即通过操纵或破坏证书颁发机构。

以上是对HTTPS安全及其实现原理的学习,其中没有提到TLS/SSL版本、加密算法相关的内容,有兴趣的可以自行检索。

希望小作文对你有些许帮助,如果内容有误请指正。

您可以随意转载、修改、发布本文,无需经过本人同意。通过博客阅读iqsing.github.io

参考:

what-is-a-certificate-authority

The HTTPS-Only Standard

理解https中的安全及其实现原理的更多相关文章

  1. 深入理解 Laravel 中 config 配置加载原理

    Laravel的配置加载其实就是加载config目录下所有文件配置.如何过使用php artisan config:cache则会把加载的配置合并到一个配置文件中,下次请求就不会再去加载config目 ...

  2. 深入理解Java中的HashMap的实现原理

    HashMap继承自抽象类AbstractMap,抽象类AbstractMap实现了Map接口.关系图例如以下所看到的: Java中的Map<key, value>接口同意我们将一个对象作 ...

  3. 前端知识体系:JavaScript基础-原型和原型链-理解 es6 中class构造以及继承的底层实现原理

    理解 es6 中class构造以及继承的底层实现原理 原文链接:https://blog.csdn.net/qq_34149805/article/details/86105123 1.ES6 cla ...

  4. 通俗的理解HTTPS以及SSL中的证书验证

    一.HTTPS的安全性体现在哪 HTTP(超文本传输协议,Hyper Text Transfer Protocol)是我们浏览网站信息传输最广泛的一种协议.HTTPS(Hyper Text Trans ...

  5. 深入理解JS中的对象(二):new 的工作原理

    目录 序言 不同返回值的构造函数 深入 new 调用函数原理 总结 参考 1.序言 在 深入理解JS中的对象(一):原型.原型链和构造函数 中,我们分析了JS中是否一切皆对象以及对象的原型.原型链和构 ...

  6. 深入理解JS中的对象(三):class 的工作原理

    目录 序言 class 是一个特殊的函数 class 的工作原理 class 继承的原型链关系 参考 1.序言 ECMAScript 2015(ES6) 中引入的 JavaScript 类实质上是 J ...

  7. ajax和springmvc的请求响应原理——深入理解jQuery中$.get、$.post、$.getJSON和$.ajax的用法

    1,四大重要部分: 请求链接 post请求和get请求 请求参数形式 响应内容形式 2,从springmvc的controller角度,controller能接收到请求的前提 请求链接必须对应 pos ...

  8. 深入理解css中position属性及z-index属性 https://www.cnblogs.com/zhuzhenwei918/p/6112034.html

    深入理解css中position属性及z-index属性 请看出处:https://www.cnblogs.com/zhuzhenwei918/p/6112034.html 在网页设计中,positi ...

  9. 【干货理解】理解javascript中实现MVC的原理

    理解javascript中的MVC MVC模式是软件工程中一种软件架构模式,一般把软件模式分为三部分,模型(Model)+视图(View)+控制器(Controller); 模型:模型用于封装与应用程 ...

随机推荐

  1. C# 编写 Windows 动态桌面软件实现(一)之桌面交互功能

    DreamScene2 1.3 版本已经发布了,现在支持鼠标和桌面交互功能.这个功能不会影响性能,基本不占用 CPU.这个功能让我对 Windows 消息机制有了更深入的理解,在这篇博客中我会详细介绍 ...

  2. NFS 部署

    目录 NFS 部署 NFS简介 NFS应用 NFS工作流程图 NFS部署 服务端 客户端 测试NFS文件同步功能 NFS配置详解 NFS部分参数案例 统一用户 搭建考试系统 搭建步骤 配合NFS实现文 ...

  3. 【jvm】02-手写自己的类加载器

    [jvm]02-手写自己的类加载器 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请顺手点个赞.加个 ...

  4. linux 部署.net core 环境

    Linux版本Ubuntu 16.04 .net core 下载地址:https://dotnet.microsoft.com/download/dotnet-core/2.1 虽然现在现在.net ...

  5. win10 安装vue 详解-包括node.js、npm、webpack

    1.下载 去官网下载 node.js https://nodejs.org/en/download/ 一般不会选择最新的,我安装的是 12.18.4 进入历史记录页面网址 https://nodejs ...

  6. js 模块化 -- 基本的导出与引入class模块

    1.目录结构 2.类语法与导出 class food { } //定义常量 let c = "苹果"; //正确的函数写法 food.prototype.getfood = fun ...

  7. 安装KVM

    在VMWare安装CentOS7 选择图形界面和开发工具 设置网络 cd /etc/sysconfig/network-scripts/ vi ifcfg-ens33 BOOTPROTO=static ...

  8. jsp使用${}语法,对应的spring后台使用Model

    实现的前提,一定要在jsp文件顶部加上 <%@page isELIgnored="false" %> 如上图${aa}与${bb},是直接使用Model的key值对应的 ...

  9. 51 Nod 1133 不重叠的线段 (贪心算法)

    原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1133 题目分析:感觉这到第不应该被分到二级算法题,比 109 ...

  10. python基本数据类型与操作

    一.变量 1.变量的三要素:变量名.变量值.变量数据类型 2.定义变量格式:变量名称 = 变量值 3.输出变量:print(变量名) """ 变量 "" ...