HTTP通讯安全中的Digest摘要认证释义与实现

article/2025/11/8 15:59:23

摘要

出于安全考虑,HTTP规范定义了几种认证方式以对访问者身份进行鉴权,最常见的认证方式之一是Digest认证

Digest认证简介

        HTTP通讯采用人类可阅读的文本格式进行数据通讯,其内容非常容易被解读。出于安全考虑,HTTP规范定义了几种认证方式以对访问者身份进行鉴权,最常见的认证方式之一是Digest认证。Digest是一种加密认证方式,通讯中不会传输密码信息,而仅采用校验方式对接入的请求进行验证。

        Digest认证支持的加密算法有:SHA256,SHA512/256,MD5。上述这几种算法都是由哈希函数来生成散列值,其加密过程为单向计算,请求方无法反算出密码明文。这里需要强调的是,HTTP认证像其它认证方式一样仅仅对资源访问进行鉴权,但无法保证通讯过程的安全。

通讯协商过程

发起请求

# <<127.0.0.1:50315
GET / HTTP/1.1
Host: 127.0.0.1:9090


质询

# >>127.0.0.1:50315
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest realm="http-auth@mozicoder.org",
              nonce="M0P1F4D75VG1IFAJNKA7YG5FW1WRMGCP",
              opaque="IGH008EZM3E277G3BXVGWTABKRE6URHK",
              algorithm=MD5,
              qop="auth"
Server: Mozi.HttpEmbedded/1.4.7.0
 

请求验证

# >>127.0.0.1:50325
GET / HTTP/1.1
Host: 127.0.0.1:9090
Authorization: Digest realm="http-auth@mozicoder.org",
            username="admin",
            nonce="M0P1F4D75VG1IFAJNKA7YG5FW1WRMGCP",
            uri="/", 
            algorithm=MD5,
            response="1cfe3a00105362cbe5174cb525784f4f",
            opaque="IGH008EZM3E277G3BXVGWTABKRE6URHK",
            qop=auth,
            nc=00000001, 
            cnonce="0698175c27a8bcee"

校验并返回

# >>127.0.0.1:50325
HTTP/1.1 200 OK
Server: Mozi.HttpEmbedded/1.4.7.0

Digest认证的参数

服务端

realm

认证域。明文信息,用于提示客户端使用哪些用户名和密码。这个值可以设置成任意字符串,建议不要超出ASCII范畴。建议设置成 {string}@{domain} 这种格式,例如:http-auth@mozicoder.org。

domain

受保护的域名信息。以空格为分割,可以是绝对地址,也可以是相对路径。

nonce

随机数。用于参与加密运算,其值取决于服务端如何生成这个参数值。推荐使用B64字符串或HEX字符串。服务端可通过算法实现none的有效时间来防止重放攻击。

opaque

透传字符串。客户端在请求中附带同样的参数值。

stale

随机数是否过期。用于指示客户端认证信息中的随机数是否过期。

algorithm

算法类型。算法类型包括SHA256,SHA512/256,MD5。如果参数列表中没有出现这个值,则默认使用MD5。建议使用MD5。

qop

加密质量。可选值为auth,auth-int。具体区别请文章中的算法实现。

charset

字符集。其唯一可以设置的值为"UTF-8"。一般不设置这个值,这个参数意义不大。

userhash

是否将用户名也进行加密。取值范围:true|false,默认不进行设置,也就是false。

客户端

realm

认证域。明文信息,用于提示客户端使用哪些用户名和密码。使用服务端返回的字符串。

response

加密结果。此值是加密检验的最终对比对象。

username

用户名。

username*

扩展的用户名。当用户名中出现了不符合ABNF范式的字符串的时候,使用这个参数设置用户名和密码,同时也要满足userhash=false这个条件。

uri

路径信息。指示当前正在请求的路径信息,值为相对于根路径的相对路径。

qop

加密质量。可选值为auth,auth-int。具体区别请文章中的算法实现。

cnonce

客户端随机数。用于参与加密运算,其值取决于客户端如何生成这个参数值。推荐使用B64字符串或HEX字符串。服务端可通过算法实现none的有效时间来防止重放攻击。

nc

客户端请求校验的次数。是一个16进制的数值,表示同一nonce下客户端发送出请求的数量。

userhash

是否将用户名也进行加密。取值范围:true|false,默认不进行设置,也就是false。注意:上述参数值仅username, realm, nonce, uri,response, cnonce, and opaque这几个字段可以使用""进行包裹。

Digest认证的验证算法

response=H(HA1:HD:HA2)

//如果加密算法以"-sess"结束

if  !algorithm.EndWith("-sess"){

        HA1=H(username:realm:password)

}else{

        HA1=H(username:realm:password: nonce:cnonce)

}

HD=nonce:nc:cnonce:qop

if  qop!="auth-int"{

        HA2=H(Method:url)

}else{

        HA2=H(Method:url:Body-Length)

}

 

参考文档

[RFC7616]    R. Shekh-Yusef, Ed.D. Ahrens,S. Bremer,"HTTP Digest Access Authentication"


http://chatgpt.dhexx.cn/article/5tJ8NsG0.shtml

相关文章

http协议之digest(摘要)认证,详细讲解并附Java SpringBoot源码

目录 1.digest认证是什么&#xff1f; 2.digest认证过程 3.digest认证参数详解 4.基于SpringBoot实现digest认证 5.digest认证演示 6.digest认证完整项目 7.参考博客 1.digest认证是什么&#xff1f; HTTP通讯采用人类可阅读的文本格式进行数据通讯&#xff0c;其内容非…

【WinRAR】WinRAR 6.01 官方最新简体中文版

WinRAR 6.01 官方简体中文商业版下载地址&#xff08;需要注册&#xff09;&#xff1a; 64位&#xff1a; https://www.win-rar.com/fileadmin/winrar-versions/sc/sc20210414/wrr/winrar-x64-601sc.exe https://www.win-rar.com/fileadmin/winrar-versions/sc/sc20210414/…

WinRAR命令行

基本使用 实践 将文件夹压缩到zip包 输入&#xff1a;文件夹如下&#xff0c;文件夹为class。 输出&#xff1a;classes.zip 指令如下&#xff1a; rar a classes.zip .\classes或者 WinRAR a classes.zip .\classes结果如下&#xff1a; PS C:\Users\liyd\Desktop\kuai…

WinRAR安装教程

文章目录 WinRAR安装教程无广告1. 下载2. 安装3. 注册4. 去广告 WinRAR安装教程无广告 1. 下载 国内官网&#xff1a;https://www.winrar.com.cn/ 2. 安装 双击&#xff0c;使用默认路径&#xff1a; 点击“安装”。 点击“确定”。 点击“完成”。 3. 注册 链接&#x…

WinRAR注册+去广告教程

1、注册 在WinRAR安装目录创建rarreg.key文件&#xff0c; 拷贝如下内容并保存&#xff1a; RAR registration data Federal Agency for Education 1000000 PC usage license UIDb621cca9a84bc5deffbf 6412612250ffbf533df6db2dfe8ccc3aae5362c06d54762105357d 5e3b1489e751c…

WinRAR4.20注册文件rarreg.key

2019独角兽企业重金招聘Python工程师标准>>> 在WinRAR的安装目录下&#xff0c;新建rarreg.key文件&#xff08;注意不要创建成rarreg.key.txt文件了^_^&#xff09;&#xff0c;内容为如下&#xff1a; RAR registration data Team EAT Single PC usage license UI…

Android按钮样式

//创建一个新的XML文件&#xff0c;可命名为styles<style name"button1"><item name"android:layout_height">wrap_content</item><item name"android:textColor">#FFFFFF</item><item name"android:text…

漂亮的Button按钮样式

开发中各种样式的Button,其实这些样式所有的View都可以共用的,可能对于你改变的只有颜色 所有的都是用代码实现 边框样式,给你的View加上边框 <Buttonandroid:layout_width="0dip"android:layout_height="match_parent"android:layout_margin=&q…

「HTML+CSS」--自定义按钮样式【001】

前言 Hello&#xff01;小伙伴&#xff01; 首先非常感谢您阅读海轰的文章&#xff0c;倘若文中有错误的地方&#xff0c;欢迎您指出&#xff5e; 哈哈 自我介绍一下 昵称&#xff1a;海轰 标签&#xff1a;程序猿一只&#xff5c;C选手&#xff5c;学生 简介&#xff1a;因C语…

HTML_炫酷的按钮样式

html部分 <a href"#"><span></span><span></span><span></span><span></span>Neon button</a><a href"#"><span></span><span></span><span></span…

html改变按钮样式

今天有人问我怎么改样式&#xff0c;需求是三个按钮&#xff0c;一次点一个&#xff0c;要求被点击的按钮和没被点的按钮是两种不同的样式&#xff0c;如图所示。 最初三个按钮都没选如图一&#xff0c;然后点击“已读”按钮&#xff0c;“已读”按钮样式改变。再点击“全部”按…

button按钮的一些样式效果

先制作一个button按钮 &#xff0c;将它原本的样式取消掉再把button按钮的颜色设置成transparent &#xff0c;再设置button按钮的边框。首先将button按钮的初始样式取消掉 &#xff0c;在设置button按钮的width和 height &#xff0c;font-size &#xff0c;还有border 现在写…

vue点击按钮改变按钮样式

一. 效果 点击按钮前&#xff1a; 点击按钮后&#xff1a; 再次点击按钮变回原来的样式&#xff1a; 二. 具体代码 <template><div id"box"><button click"btn" id"but" v-bind:class"{ but01: style1, but02: style2 }&qu…

CSS 按钮button美化

.login-button { /* 按钮美化 */width: 270px; /* 宽度 */height: 40px; /* 高度 */border-width: 0px; /* 边框宽度 */border-radius: 3px; /* 边框半径 */background: #1E90FF; /* 背景颜色 */cursor: pointer; /* 鼠标移入按钮范围时出现手势 */outline: none; /* 不显示轮廓…

css 按钮按下样式

在项目开发中&#xff0c;按钮通常需要添加按钮的获得焦点状态&#xff0c;电脑端用 :hover 移动端用 :active 。多个按钮需要添加时&#xff0c;就得添加多个获得焦点样式。 可通过添加背景图片的方式来给所有的按钮添加样式&#xff0c;该样式会给当前按钮添加一个白色的透明…

button样式设置:按钮按压效果

在学习MVC基础时&#xff0c;里面的案例有很多都是有按钮的&#xff0c; 但button的默认样式不好看&#xff0c;于是设置了按钮的样式&#xff0c;按 钮按压时有一种现实生活中按钮向下压的效果&#xff0c;这样看起来 非常美观&#xff0c;代码也是不多&#xff0c;简单而又实…

Button按钮的元素与样式改变

作者&#xff1a;李坤凤 本次任务完成时间&#xff1a;2019年6月22日 开发工具与关键技术&#xff1a;开发工具&#xff1a;VS 关键技术: Button按钮的元素与样式改变 1、在button元素中&#xff0c;原始的元素就是一个没有任何样式的按钮&#xff0c;直接使用感觉一点美感没有…

几款好看的HTML按钮样式

给大家介绍几款好看的HTML按钮样式 按钮样式一: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"> <…

Bootstrap之按钮的样式

在bootstrap中, 按钮(button)有不同的六种方式. 默认的button的样式是: btn. 这个是必要的样式. 还有其他的六种不同方式展现.分别为: 默认, 主要, 成功, 信息, 警告, 危险, 链接.今天我们就来仔细探讨下按钮的风格样式。 使用class可以快速创建一个带有样式的按钮。 原文链接…

button按钮样式

在许多网站中都需要实用到按钮&#xff0c;一个好看实用的css按钮即可以给访问者以美感&#xff0c;又可以方便开发者。下面就是一个纯css按钮&#xff0c;需要的可以参考。 css代码 .div {display: inline-block;padding: .3em .5em;background-image: linear-gradient(#ddd, …