当前位置: 首页 > news >正文

Https身份鉴权(小迪网络安全笔记~

附:完整笔记目录~
ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正!

5.2 Https&身份鉴权

  1. 引子:上一篇主要对Http数据包结构、内容做了介绍,本篇则聊聊Https、身份鉴权等技术。

  2. Https

    1. 概述
      由于Http报文在通信链路中明文传输,因此一旦报文被截获,任何人都可查看更改Http报文内容。而这一行为往往会造成许多安全隐患,如窃取受害者的登录凭证、使受害者访问恶意网页等。
      这也是我们所常说的中间人攻击,而Https则为解决该问题而出现,通过TLS加密协议,确保数据在传输时不会被第三方窃取且能对用户访问服务器身份进行验证。
    2. Https数据包
      接下来展示通过WireShark嗅探到的Http/Https数据包。
      image-20241208132924465
    3. Q&A
      Q1:既然Https数据包被加密,那为什么在浏览器&各抓包软件中都可以获取到Https数据包的实际内容呢?
      A1:这其实是基于TLS加密原理。简单来说通过TLS加密的报文内容,无论是客户端还是服务端在获取到报文时均需先使用证书进行解密才能得到原报文内容。我们的浏览器实际上已经提前将所需证书安装好了,而各抓包软件也同样内置了证书。
      Q2:那既然抓包软件内置了证书,已经可以拦截、解密Https数据包了,为什么我们本地也需要额外安装抓包软件的证书?
      A2:是因为Https数据包由抓包软件转发给用户本地,而证书不仅有解密TLS的功能,也能验证用户访问的服务器是否合法。若本地不安装抓包软件证书,则当Https报文由抓包软件转发给本地浏览器时,由于证书校验不上,浏览器会弹出安全告警且阻止解密。(当然,你要使用抓包软件自带浏览器则无该问题,因为其浏览器已经装好了对应证书。)
  3. 身份鉴权
    引子:Https解决了Http报文在客户端和服务端之间安全传输的问题,而客户端自身仍会产生安全问题,如越权访问、敏感用户账号密码被爆破、身份被伪造等。因此产生了身份鉴权技术,其目的就是为了确认用户/系统在访问某一资源时,身份是否合法。下面则对常见的身份鉴权方式做一介绍。

  4. Http基本鉴权

    1. 概述:组合用户所输入的账户&密码,并进行base64编码。

    2. 鉴权流程

      1. 请求一个受限内容。
      2. 客户端输入账户&密码,账户密码于前端被组合且进行base64编码。
      3. 服务端收到后,解码并验证账户密码是否正确。
    3. 影响

      1. 对于用户:每一次访问新的受限内容时,无论是否跨域,都需重新输入账户&密码,很麻烦。
      2. 对于安全测试者:账户&密码就相当于明文传输,常规测试手法仍有效,如爆破、注入等。
        现如今也几乎不存在这种鉴权方式,放到这了解一下就行。
  5. Session - Cookie

    1. 概述:Session - Cookie为解决用户每次访问新受限页面时需重新登录问题。

    2. 鉴权流程

      1. 请求一个受限内容,客户端输入账户&密码。
      2. 服务端收到后,基于用户输入生成Session并保存。
      3. 此时在服务端响应包中,响应头会存在一个Set-Cookie字段,其内容则为刚刚生成Session的唯一标识Session ID。
      4. 客户端收到后,会将Set-Cookie的值(Session ID)存储于本地浏览器Cookie中。
      5. 当客户端对同站不同页面内容进行访问时,其请求包请求头会携带Cookie。
      6. 服务端收到后,只需比对保存的Session和来自客户端Cookie中的Session ID,就能通过ID判断会话是否存在。若会话存在则证明客户端身份正确,无需客户端反复输入账户密码。
        补:我们常常会发现,发送给服务端的Cookie内容往往有很多,因为Cookie除了含有登录凭证外,还有一些个性化设置或其它要记录的数据等内容。
    3. 影响

      1. 对于服务端:服务端需保存每个用户Session,且Session会过期(默认关闭浏览器后Session过期,当然服务端也可自定义过期时间),服务端需定期清理过期的Session,影响服务器性能。
      2. 对于安全测试者:一旦用户Cookie被窃取,且服务端Session并未过期。那攻击者就可以利用用户Cookie,实现 用户登录、伪造用户操作等行为,这也是XSS、CSRF攻击的原理。
        补:基于Session - Cookie实现的攻击思路往往是窃取被保存至客户端本地的Cookie,但我们知道能实现身份认证的仅为Cookie中的Session ID,那Session ID可不可以被破解伪造呢?(emmm。。。来自小白的提问)
  6. Token

    1. 概述:工作机制&实现功能,与Session - Cookie类似,不过Token往往会携带完整的用户身份认证信息。
    2. 鉴权流程
      1. 请求受限内容,客户端输入账户&密码。
      2. 服务端收到账户密码后,依据后端逻辑,生成加密后的Token,并返回给客户端。
      3. 客户端收到Token并将其保存至本地浏览器。(Token除了被保存到浏览器Cookie外,也可以被存储至localStorage、sessionStorage等。)
      4. 当客户端再次对受限内容请求时,请求包会默认携带Token。
      5. 服务端接收并验证Token是否有效,实现身份鉴权。
    3. 影响
      1. 对于服务端:由于Token内已经携带用户的完整信息,相较于Session - Cookie,服务端要存储每一个用户的会话,Token则无需存储,服务端只需接收并验证即可。节约服务端性能。
      2. 对于安全测试者:Token往往在生成时会设置过期时间,一般过期时间较短。相较于Session - Cookie,更加安全。
  7. JWT

    1. 概述:全称JSON Web Token,其实从名字就可以看出JWT也是Token鉴权的一种。

    2. 鉴权流程:同Token。

    3. 特征
      由于JWT具有很明显的特征,因此在这里额外聊一下。
      JWT的组成:Header . Payload . Signature(头部 . 载荷 . 签名)
      Header: 存储JWT的基本信息,如Token类型、签名算法等,并进行base64编码。给一个JWT的官方示例:

      // Header经base64编码
      eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
      // 解码后
      {"alg": "HS256",// jwt签名算法"typ": "JWT"// token类型
      }
      

      Payload:存储JWT&用户的有效信息,如JWT过期时间、用户id、用户名等,并进行base64编码。同样是官方示例:

      // Payload经base64编码
      eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
      // 解码后
      {"sub": "1234567890","name": "John Doe","iat": 1516239022
      }
      // 我们称:sub、name、iat这些字段为声明
      // 其中sub、iat为JWT注册声明,而每一个注册声明都有其特定含义。
      

      这里对JWT注册声明进行列举

      字段名含义
      iss签发者 (Issuer),表示 JWT 的创建者或签发服务的标识。
      sub主题 (Subject),表示 JWT 的主题,一般是用户的唯一标识符。
      aud受众 (Audience),表示 JWT 的接收者,通常是应用程序的标识。
      exp过期时间 (Expiration Time),表示 Token 的到期时间,单位为秒的时间戳。
      nbf生效时间 (Not Before),表示 Token 的有效开始时间。在该时间之前,JWT 无效。
      iat签发时间 (Issued At),表示 JWT 的签发时间。
      jtiJWT ID,表示 Token 的唯一标识符,常用于避免重复使用 Token(防止重放攻击)。

      Signature:验证JWT完整性,Signature计算方式:

      Header记录的加密算法(base64UrlEncode(header) + "." + base64UrlEncode(payload),secrect// 密钥
      )
      // 官方示例的Signature
      SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
      

      将这三部分通过 “.” 组合,构成完整的JWT

      eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
      

      了解其组成后,也就可以得出JWT特征:eyJxxxxxx.eyJxxxxxx.signature。

    4. 影响

      1. 对于服务端:同Token。
      2. 对于安全测试者:由于JWT前两part仅进行base64编码,则一旦JWT算法密钥被获取&爆破,则可实现伪造JWT。
  8. OAuth

    1. 概述:OAuth作为一个授权框架,允许用户在不暴露其凭证的情况下,授权第三方应用访问其在另一个服务提供商上的受保护资源。简单来说,使用OAuth,用户就可以在不向第三方泄露自己账户密码的情况下,使第三方应用实现部分资源访问。
      举个栗子:使用QQ登录百度,执行授权操作后,百度在未获取到QQ账户&密码的情况下 1. 实现了登录。2. 通过获取到的QQ账户信息创建了百度账户。

    2. 授权流程
      注:由于OAuth2.0标准定义了四种授权方式,分别为授权码、隐藏式、密码式和客户端凭证。其中授权码方式是如今被应用最多的,因此本文仅介绍使用授权码方式的授权流程,如果想了解其余授权方式可参考:
      https://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html

      1. 在OAuth授权中共有三位角色,用户所属的客户端,用户所访问的第三方应用,第三方应用需要请求资源的服务端(在该服务端中又分别存在授权服务,资源服务)。

      2. 当客户端访问的第三方应用想要获取服务端的资源时,需先向服务端授权服务器备案并获取其给予的client_id & client_secrect。

      3. 随后客户端需为第三方应用向服务端授权服务器申请授权码,申请成功后服务端授权服务器将授权码转发给第三方应用。

        # 授权码申请
        /oauth/authorize?client_id=xxxx&response_type=code&scope=read&redirect_uri=http://"第三方"
        # 其中reponse_type表示授权方式
        # scope表示授权范围
        # redirect_uri表示重定向地址,一般为第三方应用地址# 授权码申请成功后,随redircet_uri返回给第三方应用
        http://"第三方"/callback?code=authorationcode
        # 其中code值为授权码
        
      4. 第三方应用拿到授权码后,再向服务端授权服务器申请Token,申请成功后服务端将Token返回给第三方应用。由于Token仅在第三方应用与服务端之间传递,无法被用户窃取,更加安全。

        # 第三方向授权服务器申请Token
        /oauth/token?client_id=xxxx&client_secrect=xxxx&grant_type=authoration_code&code=authorationcode&redirect_uri=http://"第三方"/
        # 其中grant_type为授权方式
        # code为第三方应用获取的授权码# 申请成功后,授权服务器将token返回给第三方应用
        
      5. 随后第三方应用凭借token向服务端资源服务器获取资源。

    3. 影响

      1. 对于服务端:解决了服务端在访问受限资源时的身份鉴权问题。
      2. 对于安全测试者:针对OAuth框架的安全问题留给后面来讨论吧,现在只需对其有基本认知即可。
        (ps:其实是我没见过)

相关文章:

Https身份鉴权(小迪网络安全笔记~

附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正! 5.2 Https&身份鉴权 引子:上一篇主要对Http数据包结构、内容做了介绍,本篇则聊聊Https、身份鉴权等技术。 …...

AngularJS 输入验证

AngularJS 输入验证 AngularJS 是一个强大的 JavaScript 框架,它允许开发者构建动态的、高性能的 Web 应用程序。在处理用户输入时,确保数据的准确性和完整性至关重要。AngularJS 提供了一套内置的输入验证机制,可以帮助开发者轻松地实现这一目标。 为什么需要输入验证? …...

【网络安全】WIFI WPA/WPA2协议:深入解析与实践

WIFI WPA/WPA2协议:深入解析与实践 1. WPA/WPA2 协议 1.1 监听 Wi-Fi 流量 解析 WPA/WPA2 的第一步是监听 Wi-Fi 流量,捕获设备与接入点之间的 4 次握手数据。然而,设备通常不会频繁连接或重新连接,为了加速过程,攻…...

前端使用xlsx-js-style导出Excel,带样式,并处理合并单元格边框显示不全和动态插入表头解决

一、在学习之前,先给出一些学习/下载地址: xlsx-js-style下载地址 https://github.com/gitbrent/xlsx-js-style 或者 https://www.npmjs.com/package/xlsx-js-style SheetJS中文教程: https://xlsx.nodejs.cn/docs/csf/cell 二、先看样…...

自动化工具ansible部署和实践

1 介绍和部署 1.1 介绍 ansible的功能 我爱你在当今的IT自动化领域,Ansible无疑是一个无法被忽视的重要角色。其便利性和高效性受到了广大开发者和系统管理员的一致好评,成为了配置管理和应用部署的首选工具。然而,对于一些初学者来说&#…...

无人机推流直播平台EasyDSS视频技术如何助力冬季森林防火

冬季天干物燥,大风天气频繁,是森林火灾的高发期。相比传统的人力巡查,无人机具有更高的灵敏度和准确性,尤其在夜间或浓雾天气中,依然能有效地监测潜在火源。 无人机可以提供高空视角和实时图像传输,帮助巡…...

React Fiber

React Fiber 是 React 16 引入的全新重写的协调(Reconciliation)算法的实现,旨在改善 React 的更新机制和性能,尤其是在复杂应用和大量更新的场景下。它使得 React 更加灵活、可调度,能够实现优先级控制和中断更新等特…...

【前端】JavaScript 中的 map() 方法:高级解析与应用

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯map() 方法的定义与核心特性1.1 方法定义1.2 主要特性 💯map() 方法的语法与高级用法2.1 基本语法2.2 简化写法与箭头函数2.3 结合链式操作 💯ma…...

《智能体开发实战(高阶)》四、系统化的日志周报智能体开发计划

智能体扩展与完善规划 为了将前几个章节的智能体逐步扩展为支持整个公司团队使用的高效工具,以下是分阶段的完善与扩写规划。每个阶段旨在提升功能覆盖范围、处理能力和用户体验,并为企业提供实际价值。 阶段一:基础功能完善 目标:巩固现有功能,提升健壮性和适用性。 支…...

什么是Apache日志?为什么Apache日志分析很重要?

Apache是全球最受欢迎的Web服务器软件,支持约30.2%的所有活跃网站。凭借其可靠性、灵活性和强大的功能,Apache数十年来一直是互联网的中坚力量。 一、Apache Web服务器的工作原理 Apache Web服务器的工作原理如下: 接收HTTP请求&#xff1…...

Mybatis——(2)

2.2 Mybatis 工具类(了解) 为了简化MyBatis的开发,可将MyBatis进一步封装。 import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apa…...

景联文科技入选中国信通院发布的“人工智能数据标注产业图谱”

近日,由中国信息通信研究院、中国人工智能产业发展联盟牵头,联合中国电信集团、沈阳市数据局、保定高新区等70多家单位编制完成并发布《人工智能数据标注产业图谱》。景联文科技作为人工智能产业关键环节的代表企业,入选图谱中技术服务板块。…...

修改浏览器地址栏参数

Vue 修改当前页面地址栏参数 function updateUrlParameter(param: string, value: string) {const url new URL(window.location.href); // 获取当前页面的 URL// 解析哈希部分const hash url.hash ? url.hash.slice(1) : "";const [path, queryString] hash.sp…...

Spring Boot教程之二十五: 使用 Tomcat 部署项目

Spring Boot – 使用 Tomcat 部署项目 Spring Boot 是一个基于微服务的框架,在其中创建可用于生产的应用程序只需很少的时间。Spring Boot 建立在 Spring 之上,包含 Spring 的所有功能。如今,它正成为开发人员的最爱,因为它是一个…...

解决 Git 默认不区分文件名大小写的问题

不得不说 Git 默认不区分文件名大小写真是一个大坑,由于之前的项目目录比较乱,项目下的文件夹命名都不规范,这两天一直在整理,然后今天从服务器将项目重新 clone 下来后发现,之前将所有文件名首字母改成大写的改动全部…...

python学opencv|读取图像(十二)BGR图像转HSV图像

【1】引言 前述已经学习了opencv中图像BGR相关知识,文章链接包括且不限于下述: python学opencv|读取图像(六)读取图像像素RGB值_opencv读取灰度图-CSDN博客 python学opencv|读取图像(七)抓取像素数据顺利…...

信息安全工程师-选择题考点总结

密码理论知识 基础理论 一个密码系统至少由明文、密文、加密算法、解密算法和密钥五个部分组成,而其安全性是由密钥决定的。 按照密钥特征的不同,密码体制分为:对称密码体制和非对称密码体制。 按照对明文加密方式的不同,密码体制分为:流密码和分组密码。 非对称密码体…...

重学SpringBoot3-WebClient配置与使用详解

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-WebClient配置与使用详解 1. 简介2. 环境准备2.1 依赖配置 3. WebClient配置3.1 基础配置3.2 高级配置3.3 retrieve()和exchange()区别 4. 使用示例4.1 …...

springBoot中的日志级别在哪里配置

在Spring Boot中,日志级别的配置可以通过多种方式来实现,主要包括在配置文件中设置、使用自定义的logback配置文件,以及在代码中动态配置等。以下是一些具体的配置方法: 一、在配置文件中设置日志级别 Spring Boot默认使用appli…...

统一身份安全管理体系的业务协同能力

随着集团企业数字化组织转型深化,各组织机构间业务协同程度提升。研发业务协同、数据驱动生产决策等数字化生产协作工作体系得以展开,企业内数据流转加快。企业对统一身份安全管理体系的业务协同管理和支撑能力要求提升: 统一身份管理流程需…...

JAVA课堂笔记23(IO流 (java.io包中))

第五章:IO流 (java.io包中) 三、字符流 1. 字符流的父类(抽象类): Reader:字符输入流 对应的操作为读操作 功能方法:read方法 Writer:字符输出流 对应的操作为写操作 功能方法:write方法 …...

C# DLT645 97/07数据采集工具

电表模拟器 97协议测试 07协议测试 private void btnSend_Click(object sender, EventArgs e) {string addr txtAddr.Text.Trim();string data txtDataFlg.Text.Trim();byte control 0x01;switch (cmbControl.SelectedIndex){case 0: control (byte)0x01; break;// 97协议c…...

中后台管理信息系统:Axure12套高效原型设计框架模板全解析

中后台管理信息系统作为企业内部管理的核心支撑,其设计与实现对于提升企业的运营效率与决策能力具有至关重要的作用。为了满足多样化的中后台管理系统开发需求,一套全面、灵活的原型设计方案显得尤为重要。本文将深入探讨中后台管理信息系统通用原型方案…...

Reactor 响应式编程(第四篇:Spring Security Reactive)

系列文章目录 Reactor 响应式编程(第一篇:Reactor核心) Reactor 响应式编程(第二篇:Spring Webflux) Reactor 响应式编程(第三篇:R2DBC) Reactor 响应式编程&#xff08…...

JVM 双亲委派模型以及垃圾回收机制

目录 1. JVM 内存区域划分 2. JVM 中类加载的过程 1) 类加载的基本流程 2) 双亲委派模型 3. JVM 中垃圾回收机制 1) 找到垃圾 a) 引用计数 b) 可达性分析 2) 释放垃圾 1. JVM 内存区域划分 一个运行起来的 Java 进程,其实就是一个 JVM 虚拟机。 而进程是…...

Delphi编写涂鸦桌面的小程序

用Delphi编写涂鸦桌面的小程序,类似于腾讯会议中的画板功能的实现。这里用Delphi实现代码给大家提供一些思路; 首先,新建一个Application,将Form1的WindowState设为wsMaximized,BorderStyle设为bsNone。这样做的目的就…...

智星云技术文档:GPU测速教程

安装gpu burn git clone https://github.com/wilicc/gpu-burn cd gpu-burn/ make测试 ./gpu_burn 60100.0% procd: 14280 (7373 Gflop/s) - 13390 (6997 Gflop/s) - 15912 (7110 Gflop/s) - 13184 (7055 Gflop/s) - 13464 (7369 Gflop/s) - 13974 (7351 Gflop/s) - 16626 (7…...

《Kali Linux 软件源更换攻略:优化软件获取与系统更新》

KALI为什么要换源 速度提升 Kali Linux 默认的软件源服务器通常位于国外。在从这些国外源下载软件包、更新系统时,会受到网络带宽、网络延迟等因素的限制。例如,在中国,连接到国外服务器的网络速度可能较慢,尤其是在下载大型软件…...

C# 在dataview可以直接增删改查mysql数据库

C# 在dataview可以直接增删改查mysql数据库 首先,确保你的项目中已经安装了MySql.Data。你可以通过NuGet包管理器安装它: Install-Package MySql.Data -Version 8.0.28using System; using System.Data; using MySql.Data.MySqlClient;public class My…...

C#—泛型约束

C#—泛型约束 概念: 泛型约束就是告知编译器类型参数必须具备的功能。 在没有任何约束的情况下,类型参数可以是任何类型。 编译器只能假定 System.Object 的成员,它是任何 .NET 类型的最终基类。当分配给泛型的类型参数不满足约束的类型时&…...