HTTP Authentication之Basic认证、Digest认证

2023-05-16

本文为博主原创,未经许可严禁转载。
本文链接:https://blog.csdn.net/zyooooxie/article/details/109691608

前面说到 Fiddler 的QuickExec、Filters ,本篇分享 说的是用AutoResponder 来模拟HTTP Basic、Digest认证。

个人博客:https://blog.csdn.net/zyooooxie

AutoResponder

这功能启用后,可以将某一请求的响应结果替换成指定的资源,可以是本地文件,也可以是Fidder内置的各种HTTP响应。

模拟Basic认证

HTTP Basic Authentication 认证过程:
1.客户端向服务器请求数据;
2.服务器认为没有通过认证,向客户端发送401 (WWW-Authenticate: Basic realm=“XXXXXX”);
3.客户端将自动弹出一个登录窗口,要求用户输入用户名和密码;
4.用户输入用户名和密码后,客户端将用户名及密码以BASE64编码加密,发请求(Authorization: Basic xxxxxxxxx);
5.服务器收到上述请求信息后,将Authorization字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证;

第一步:test_url替换为401_AuthDigest.dat
在这里插入图片描述

第二步:浏览器访问test_url,看到弹窗
在这里插入图片描述

第三步:手动输入“zyooooxie” 、“csdn” 【用户名:‘zyooooxie’,密码:‘csdn’】

第四步:抓包,查看实际请求

先将用户名及密码以BASE64编码,看看结果:

在这里插入图片描述

再看下 Fiddler抓包 结果:

在这里插入图片描述
在这里插入图片描述

如何来请求呢?

A. 用Postman来看下:

在这里插入图片描述
抓包:
在这里插入图片描述
在这里插入图片描述

回头再看下

在这里插入图片描述

B. 用requests来看下:

res = requests.get('https://www.youxi369.com/gonglue/7814.html', verify=False, auth=('zyooooxie', 'csdn'))
# print(res.request.headers)
print(res.request.headers['Authorization'])
print(res.headers)

print()

res = requests.get('https://www.youxi369.com/gonglue/7814.html', verify=False, auth=HTTPBasicAuth('zyooooxie', 'csdn'))
print(res.request.headers['Authorization'])
print(res.headers)

在这里插入图片描述

抓包:

在这里插入图片描述

C.用JMeter来看下 【简单】
【为了和前面有区分,使用zyoooo、csdn为账号、密码】

1.使用 HTTP Authorization Manager
2.采样器 代理到我本地的Fiddler

在这里插入图片描述

在这里插入图片描述

看下抓包结果

chrome直接输入 请求的
在这里插入图片描述

JMeter请求的
在这里插入图片描述

D.用JMeter来看下 【复杂】
【为了和前面区别,使用csdn、zyoooo为账号、密码】

1.BeanShell PreProcessor 手动来Base64编码,设置变量
2.使用HTTP Header Manager 手动增加Authorization
3.采样器 代理到我本地的Fiddler

在这里插入图片描述

在这里插入图片描述

看下Debug Sampler:

在这里插入图片描述
查看结果:

在这里插入图片描述
抓包 结果:
在这里插入图片描述

浏览器直接请求:

在这里插入图片描述

模拟Digest认证

HTTP Digest Authentication 认证过程:

1.客户端先发送请求;
2.服务器端返回401,提示未认证【服务器产生一个随机数nonce,将这个随机数放在WWW-Authenticate响应头,与服务器支持的认证算法列表,认证的域realm一起发送给客户端】;
3.客户端发现是401响应,弹出认证窗口,让用户输入用户名和密码;
4.客户端以用户名,密码,nonce,HTTP方法,请求的URI等信息为基础,产生response进行反馈;
5.服务器重新计算,对客户端反馈的response进行校验,验证是否匹配;

第一步:
在这里插入图片描述
第二步:

手动输入’csdn’, ‘zyooooxie’【用户名:csdn;密码:zyooooxie】

第三步:

抓包,查看实际请求

A. 服务器返回401 “Unauthorized” 响应代码,并提供认证域(realm),以及一个随机生成的、只使用一次的数值(密码随机数)nonce。

在这里插入图片描述

B. 客户端收到服务器的401(Unauthorized)回复后,使用nonce值,加上username,password, http method, http uri利用MD5(或者服务器指定的其他算法)计算出request-digest,作为repsonse的值。

【客户端发送 响应摘要response=MD5(HA1:nonce:HA2),其中HA1=MD5(username:realm:password), HA2=MD5(method:digestURI)】

在这里插入图片描述

细致些:

对用户名、认证域(realm)以及密码的合并值计算 MD5 哈希值,结果称为 HA1。
对HTTP方法以及URI的摘要的合并值计算 MD5 哈希值,例如,“GET” 和 “/dir/index.html”,结果称为 HA2。
对 HA1、服务器密码随机数(nonce)、请求计数(nc)、客户端密码随机数(cnonce)、保护质量(qop)以及 HA2 的合并值计算 MD5 哈希值。结果即为客户端提供的 response 值

在这里插入图片描述

如何来请求呢?

A. 用Postman来看下:

在这里插入图片描述

抓包:
在这里插入图片描述

在这里插入图片描述

回头再看下:

在这里插入图片描述

B. 用requests来看下:

res = requests.get('https://www.youxi369.com/gonglue/7814.html', verify=False, auth=HTTPDigestAuth('csdn', 'zyooooxie'))
pprint(res.request.headers['Authorization'])
pprint(res.headers)

在这里插入图片描述

仔细一看,response这个值 和之前的不同呀!!!

抓包:
在这里插入图片描述

cnonce 值 不同。

【cnonce:客户端产生的随机数,用于客户端对服务器的认证。由于“中间人”与“恶意服务器”等攻击方式的存在,导致一个特意选择而非随机唯一的nonce值传给客户端用于摘要的计算成为可能,使得“选择性明文攻击”可能奏效,最后用户密码泄露。因此与nonce一样,cnonce可用于增加摘要生成的复杂性,从而增加破解密码的难度,也就保证了对服务端的认证】

那 python MD5 能不能算出来这个response?

import hashlib

realm = "realm@example.com"
nonce = "dcd98b7102dd2f0e8b11d0f600bfb0c093"
opaque = "5ccc069c403ebaf9f0171e9517f40e41"
qop = 'auth'

name = 'csdn'
pwd = 'zyooooxie'

nc = '00000001'
cnonce = "0fdb256a7022a4a8"
uri = '/gonglue/7814.html'


# HA1部分
# 当algorithm值为"MD5"或未指定时
m = hashlib.md5()

new = f'{name}:{realm}:{pwd}'
print('_MD5加密前为 :' + new)

m.update(new.encode(encoding='utf-8'))
H_new = m.hexdigest()
print('_MD5加密后为 :' + H_new)


m2 = hashlib.md5()

# HA2部分
# 当qop值为"auth"或未指定时,HA2计算方法如下
new = f'GET:{uri}'
print('___MD5加密前为 :' + new)

m2.update(new.encode(encoding='utf-8'))
H2_new = m2.hexdigest()
print('___MD5加密后为 :' + H2_new)


# response部分
# 当qop值为"auth"或"auth-int"时,response计算方法如下
response = hashlib.md5('{}:{}:{}:{}:{}:{}'.format(H_new, nonce, nc, cnonce, qop, H2_new).encode()).hexdigest()
print('response值:', response)

在这里插入图片描述

cnonce=“98501cd980670b7f”,再算下response值: 61cca301298db8ff321c87d5b1ee479f

和 之前的 Digest username=“csdn”, realm=“realm@example.com”, nonce=“dcd98b7102dd2f0e8b11d0f600bfb0c093”, uri="/gonglue/7814.html", response=“61cca301298db8ff321c87d5b1ee479f”, opaque=“5ccc069c403ebaf9f0171e9517f40e41”, qop=“auth”, nc=00000001, cnonce=“98501cd980670b7f” 结果一致

在这里插入图片描述

C.用JMeter来看下: 【简单】

【为了和前面有区分,使用csdnzyoooo、csdn为账号、密码】

1.使用 HTTP Authorization Manager
2.采样器 代理到我本地的Fiddler

在这里插入图片描述

请求头:留意字段cnonce + response
在这里插入图片描述

实际响应:
在这里插入图片描述

看下 我用浏览器请求的:
在这里插入图片描述

对比:

在这里插入图片描述

如同前面遇到的一样,cnonce值的不同,导致response值不同。

D.用JMeter来看下: 【复杂】 【待更新】
很抱歉,我的Java水平是幼稚园级别,BeanShell PreProcessor 写代码处理 还得等等。

这篇 Basic认证、Digest认证是我用Fiddler来模拟的,所以大概看看就好;实际情况,真遇到的时候 再分享吧。
字段校验:推荐使用Postman,更 ‘高级‘;学习与理解:推荐使用JMeter,整个流程都有;傻瓜式:requests,当之无愧;

在这里插入图片描述

zyooooxie

交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP Authentication之Basic认证、Digest认证 的相关文章

  • 用户注册错误:没有这样的表:auth_user

    我正在尝试使用 Django 的默认身份验证来处理注册和登录 setting py INSTALLED APPS django contrib admin django contrib auth django contrib content
  • 如何向 Scotty 中间件添加基本身份验证?

    我目前正在制作 Scotty API 但找不到任何 basicAuth 实现的示例 Wai Middleware HttpAuth 具体来说 我想将基本身份验证标头 用户 通行证 添加到我的某些端点 即以 admin 开头的端点 我已经设置
  • .htaccess 路由到服务器上的子目录?性能/加载时间

    我想知道是否可以使用 htaccess 文件将我的域直接路由到服务器上的子目录 我从常规虚拟主机提供商处购买了虚拟主机软件包 其中我的domain com 连接到我的服务器的根目录 我想知道是否可以以某种方式将 htaccess 文件上传到
  • 新站点预计支持哪些知名 OpenID 提供商?

    我计划开发一个支持 OpenID Connect 作为依赖方的 Web 应用程序 以便该应用程序的用户可以使用他选择的身份提供商进行注册和登录 这与每个 Stack Exchange 站点上的 我的登录 使用的技术相同 该应用程序可供服务器
  • 通过 http 的私有 git 存储库

    你能推荐任何简单的解决方案来设置可通过http s cleutus建议的 访问的git存储库吗 我有自己的 http 服务器 我想用它来托管一些小型私人项目 在家里我可以通过 ssh 连接 但在工作中防火墙阻止我这样做 有没有免费的方法来设
  • Angular4如何使用flatMap链接forkJoin

    我所处的情况是 我需要进行 5 个可以并行执行的 http 调用 在这五个调用之后需要执行另一个 http 调用 我在前 5 个中使用了 forkJoin 但我不知道如何链接 flatMap 或其他函数 forkJoin firstObse
  • HttpRequest PUT内容到poco库中

    我想使用 HTTP PUT 请求将一些数据从 C 应用程序发送到服务器 我在用poco http pocoproject org我的应用程序中的网络库 我正在使用这个代码片段 HTTPClientSession session uri ge
  • Perl:LWP::UserAgent 对于重定向 URL 始终返回代码 200

    我有一个简单的 url 它执行 302 临时错误 移至另一页 我尝试在 URL 返回代码 200 表示 OK 时检索它 并在返回 200 以外的其他内容时停止 My code my ua LWP UserAgent gt new env p
  • 外部依赖错误的 HTTP 状态代码

    当服务器与外部 API 通信出现问题时 返回的正确 HTTP 状态代码是什么 假设客户端向我的服务器 A 发送有效请求 然后 A 查询服务器 B 的 API 以便执行某些操作 然而 B 的 API 当前抛出 500 错误或因某种原因无法访问
  • Angular2 中 Http 的 Promise 与 Observable? [复制]

    这个问题在这里已经有答案了 本质上 正如标题所说 是否有任何理由使用可观察的承诺 https stackoverflow com questions 37364973 angular 2 promise vs observable为了进行
  • laravel 4 登录验证失败

    在 Laravel4 中 我在路由中编写了以下代码 但它总是将我重定向到登录页面 我用谷歌搜索并在堆栈溢出上找到了它 并尝试了所有解决方案但没有成功 我确信这将是一个愚蠢的错误 但请跟踪它 谢谢 Routes Route post logi
  • 确定用于映射网络驱动器的域和用户名

    使用带有 SP1 的 Windows 7 Enterprise 但我希望得到适用于 Windows XP 2003 2008 Vista 7 的通用答案 从命令提示符处 我执行net use命令将 Z 驱动器映射到另一台计算机上的共享 但我
  • 使用 Django REST 框架进行 SAML SSO 身份验证

    我目前正在开发 AngularJS 前端和 Django REST 后端 我一直在使用Django rest auth https github com Tivix django rest auth过去需要对两者之间的连接进行身份验证 但现
  • 以 RESTful 方式增加资源计数器:PUT 与 POST

    我有一个带有计数器的资源 为了举例 我们将该资源称为profile 计数器是数量views对于该配置文件 Per the 休息维基 http rest blueoxen net cgi bin wiki pl HttpMethods PUT
  • 响应 301 永久移动

    我曾经得到以下对 php 请求的响应 回复
  • MYSQL 区分大小写的 utf8 搜索(使用 hibernate)

    我的登录表具有 utf8 字符集和 utf8 排序规则 当我想要检查用户名并检索该特定用户名的其他信息时 hql 查询会为我提供小写和大写相同的结果 我应该如何处理适用于案例的 HQL 查询 我使用 Mysql 5 和 java hiber
  • CakePHP 身份验证插件身份关联

    我正在使用 CakePHP 3 8 并迁移到身份验证插件 https book cakephp org authentication 1 1 en index html https book cakephp org authenticati
  • 如何使用 Ruby on Rails 3 检查 HTTP 请求的“Content-Length”字段?

    我正在使用 Ruby on Rails 3 在我的视图文件中我有以下代码 为了避免服务器过载 我会在服务器接收上传文件之前检查上传文件的大小 这是因为 按下表单的提交按钮 服务器会先完整接收文件 然后再检查文件 我知道一个HTTP 请求有标
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 为什么 websocket 需要使用 HTTP 进行打开握手?为什么不能成为一个独立的协议呢?

    Websocket 的设计方式是 通过使其握手成为有效的 HTTP 升级请求 其服务器可以与 HTTP 服务器共享端口 我对这个设计理念存有疑问 无论如何 WebSocket 协议都是一个独立的基于 TCP 的协议 为什么我们需要这个 HT

随机推荐

  • winform窗体

    一 winform介绍 WinForm xff0c 是 Net开发平台中对Windows Form的一种称谓 WinForm是窗体应用程序 xff0c 由若干个窗体应用组成 xff0c 基于C S架构 二 winform的使用 xff08
  • 赋予人工智能记忆的人,带你梳理深度学习核心算法

    新智元翻译 1 来源 xff1a Idsia 作者 xff1a J rgen Schmidhuber 翻译 xff1a 张巨岩 作者介绍 xff1a J rgen Schmidhuber 被称为是赋予人工智能记忆的人 xff0c 递归神经网
  • C++实现贪吃蛇游戏

    注意 xff1a 本代码是在VC 43 43 6 0环境下编译的 xff0c 在其他环境如codeblocks下运行可能会产生意想不到的问题 xff0c 请尽量使用VC xff01 最近由于小编闲着慌 xff0c 捣鼓了一个贪吃蛇游戏 xf
  • Win10正式版19044.2132(KB5020435)来啦!(附完整更新日志)

    微软发布了Win10正式版KB5020435 xff08 操作系统内部版本 19042 2132 19043 2132 和 19044 2132 xff09 xff0c 此次更新主要解决了某些类型的安全套接字层 xff08 SSL xff0
  • SOUI总结之皮肤说明

    皮肤说明 说明 框架自带的皮肤都是 skin sys XXXX开始 xff0c 自带的皮肤存放位置trunk soui sys resource theme sys res xff0c 图片和名称映射关系可以打开trunk soui sys
  • C++中逗号运算符

    今天测试代码的时候 xff0c 遇到一行代码出现了疑问 xff0c 原因是出现了自减运算符和逗号运算符 xff0c 这就涉及到一个顺序的问题 xff0c 于是写了一个C 43 43 小程序 xff0c 验证了一下这个想法 include u
  • PsExec的问题及其解决办法

    C gt PsExec exe 192 168 1 142 cmd PsExec v1 98 Execute processes remotely Copyright C 2001 2010 Mark Russinovich Sysinte
  • ubuntu 18.04安装protobuf

    今天需要安装protobuf 在网上搜了一篇教程 xff0c 但是篇幅太长 xff0c 于是对其进行简化一下 原文 1 96 96 96 git clone https github com protocolbuffers protobuf
  • 读取配置文件的程序

    时常会遇到需要从配置文件中读取一些信息 xff0c 这里就提供一个例子 xff0c 方便日后使用 xff1a span class token comment ini h span span class token macro proper
  • 命令行读取参数

    有时需要从命令读取一些输入 xff0c 这里找到一个方法 xff0c 怎么实现的没有仔细研究 xff0c 但是可用 cmdline h span class token comment Copyright c 2009 Hideyuki T
  • 如何在一个shell脚本中开启多个应用程序?

    之前在csdn上搜索 xff0c 提示用gnome terminal指令 xff0c 但是发现怎么都不好使 于是找到一种解决方案 span class token comment bin bash span span class token
  • 使用openCV播放视频 在视频中加入滑动条

    include 34 opencv2 highgui highgui hpp 34 include 34 opencv2 imgproc imgproc hpp 34 include lt iostream gt include lt fs
  • Linux下vscode无法查看定义?

    今天要用到vscode查到c 43 43 程序 但是发现vscode无法查看程序的定义 于是找了一下解决方法 vscode无法转到定义可能是因为没有安装插件 由于我需要使用C 43 43 所以我这里安装的是C 43 43 插件 第一步 第二
  • 冒泡排序的实现(基于顺序表)

    对于冒泡排序的含义以及图示表示 这里就不再赘述 这篇博客已经说的很明白了 添加链接描述 于是就用代码实现了一下基于顺序表的冒泡排序 因为一直看的时大话数据结构这本书 于是把上面介绍的三种实现方法都在代码中实现一下 具体实现与书中有一些出入
  • ambiguating new declaration of 问题的解决

    今天在运行代码的时候 一直在报这样的错误 ambiguating new declaration of int NewPartition seqlist int int 查看了许久 原来是头文件中的声明类型与函数实现的声明类型不一致造成的
  • opencv中的MatConstIterator,NAryMatIterator迭代器的使用

    第一个迭代器 MatConstIterator迭代器 使用迭代器计算一个三通道三维数组中 34 最长元素 34 这个代码实现过程中 照着书中的代码抄下来一直报错 后来在查阅代码的时候 发现了问题所在 具体已经在代码中标明了 include
  • 用python实现查询天气的功能

    附上代码 import urllib request import gzip import json print 39 天气查询 39 def get weather data city name 61 input 39 请输入要查询的城市
  • 1.Docker 安装

    安装 wget 命令 yum install wget 安装docker wget q O https get docker com sh O 下载并以指定的文件名保存 以 39 39 作为file参数 xff0c 那么数据将会被打印到标准
  • linux下sudo apt-get update 报Err http://security.ubuntu.com precise-security InRelease 等

    今天在进行linux更新的时候一直报错 尝试了很多办法都不行 于是找到一个方法 切实可行 以根用户运行 cd var lib apt lists rm rm var cache apt archives lock rm var lib dp
  • HTTP Authentication之Basic认证、Digest认证

    本文为博主原创 xff0c 未经许可严禁转载 本文链接 xff1a https blog csdn net zyooooxie article details 109691608 前面说到 Fiddler 的QuickExec Filter