摘要认证及实现HTTP digest authentication

2023-05-16

最近工作需要做了摘要认证(digest authentication),下面就工作中遇到的问题及过程做一个总结。

  1. 第一次客户端请求
    GET/POST

  2. 服务器产生一个随机数nonce,服务器将这个随机数放在WWW-Authenticate响应头,与服务器支持的认证算法列表,认证的域realm一起发送给客户端,如下例子:
    HTTP /1.1 401 Unauthorized
    WWW-Authenticate:Digest
    realm= ”test realm”
    qop=auth,auth-int”
    nonce=”66C4EF58DA7CB956BD04233FBB64E0A4”
    opaque=“5ccc069c403ebaf9f0171e9517f40e41”

    •	realm的值是一个简单的字符串
    •	qop是认证的(校验)方式
    •	nonce是随机数, 可以用GUID
    •	opaque是个随机字符串,它只是透传而已,即客户端还会原样返回过来。
    •	algorithm 是个字符串,用来指示用来产生分类及校验和的算法对。如果该域没指定,则认为是“MD5“算法。
    
  3. 客户端发现是401响应,表示需要进行认证,则弹出让用户输入用户名和密码的认证窗口,客户端选择一个算法,计算出密码和其他数据的摘要(response),将摘要放到Authorization的请求头中发送给服务器,如果客户端要对服务器也进行认证,这个时候,可以发送客户端随机数cnonce。如下例子:

     GET/cgi-bin/checkout?a=b HTTP/1.1
     Authorization: Digest
     username="Mufasa", 
     realm="realm", 
     nonce="dcd98b7102dd2f0e8b11d0f600bfb0c0",  uri="/xxxx/System/Register",  
     qop=auth,  nc=00000001,  cnonce="0a4f113b",
     response="6629fae49393a05397450978507c4ef1",  
     opaque="5ccc069c403ebaf9f0171e9517f40e41"
    
  4. 服务接受摘要,选择算法,获取数据库用户名密码,重新计算新的摘要跟客户端传输的摘要进行比较,验证是否匹配。
    200 OK

  5. MD5计算方式
    在这里插入图片描述

//解析客户端发送过来的请求报头中的Authorization
Stringauthorization=request.getHeader("Authorization");
//其参数不为空,利用参数值,和服务器上存储的口令,进行比对。
if(authorization!=null&&!"".equals(authorization)){
。。。
 
Stringusername=map.get("username");
Stringrealm=map.get("realm");
Stringpassword=userService.getPassword(username);
Stringmethod=request.getMethod();
Stringuri=map.get("uri");
Stringnonce=map.get("nonce");
Stringnc=map.get("nc");
Stringcnonce=map.get("cnonce");
Stringqop=map.get("qop");
//客户端传过来的摘要
StringresponseFromClient=map.get("response");
 
//MD5计算
Stringa1=username+":"+realm+":"+password;
Stringha1=MD5Utils.getMD5(a1);
 
Stringa2=method+":"+uri;
Stringha2=MD5Utils.getMD5(a2);
//服务器计算出的摘要
StringresponseBefore=ha1+":"+nonce+":"+nc+":"+cnonce+":"+qop+":"+ha2;
StringresponseMD5=MD5Utils.getMD5(responseBefore);
//两者摘要相同,即验证成功
if(responseMD5!=null&&responseMD5.equals(responseFromClient)){
业务逻辑。。。
//两者摘要不相同,验证失败
}else{
业务逻辑。。。
}
//其参数为空,返回参数到客户端,并发起质询。
}else{
//拼接AuthorizationHeader,格式如Digestusername="admin",realm="Restrictedarea",nonce="554a3304805fe",qop=auth,opaque="cdce8a5c95a1427d74df7acbf41c9ce0",nc=00000001,response="391bee80324349ea1be02552608c0b10",cnonce="0a4f113b",uri="/MyBlog/home/Response/response_last_modified"
StringBuildersb=newStringBuilder();
sb.append("Digest");
sb.append("realm").append("=\"realm\",");
sb.append("qop").append("=\"auth,auth-int\",");
sb.append("nonce").append("=\"").append(getUUID()).append("\",");
sb.append("opaque").append("=\"").append(getUUID()).append("\"");
response.setHeader("WWW-Authenticate",sb.toString());
log.info("authorization:"+sb);
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
}

在这里插入图片描述

在这里插入图片描述

一,用摘要保护密码
摘要认证的一个改进之处是用摘要代替密码的传输,遵循的基本原则是“绝对不通过网络发送明文密码”,而是发送一个密码的摘要信息,并且这摘要信息是不可逆的,即无法通 过摘要信息反推出密码信息。而服务器本身是存储这个密码的(实际上,服务器只需知道密码的摘要即可),而客户端和服务器本身都知道这个密码。这样的话,服务器可以读取客户端的摘要和本身知道的密码进行同样计算得出的摘要进行比较,若匹配,则验证通过。
摘要是对信息主体的浓缩,摘要是一种单向函数,主要用于将无限的输入值转为有限的浓缩输出值,如MD5,则是将任意长度的字节系列转换为一个128位的摘要。MD5输出的128位的摘要通常会写出32个十六进制的字符,每个字符表示4个bit。

二,用随机数防止重放攻击
使用单向摘要就无需以明文形式发送密码了,可以只发送密码的摘要,并且可以确信,没有哪个恶意用户能轻易的从摘要中解码出原始密码。
但是,摘要被截获也可能跟密码一起好用,为了防止重放攻击的发送,服务器可以向客户端发送一个称为随机数nonce的特殊令牌,这个数会经常发生变化(可能是每毫秒,或者每次认证都发生变化,具体由服务器控制),客户端在计算摘要之前要先将这个随机数附加到密码上去。这样,在密码中加入随机数就会使得摘要随着随机数的每次变化而变化,记录下的密码摘要只对特定的随机数有效,而没有密码的话,攻击者就无法计算出正确的摘要,这样就可以防止重放攻击的发生。
摘要认证要求使用随机数,随机数是在WWW-Authenticate服务器质询响应中从服务器传输给客户端的。

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

摘要认证及实现HTTP digest authentication 的相关文章

随机推荐

  • 【matlab】矩形窗/三角窗/hanning窗/hamming窗/blackman窗的频率响应图

    File Matlab的窗函数 矩形窗 功能 xff1a 降低旁瓣水平 参数 xff1a N 61 51 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • eclipse无法导入项目由于“某些项目因位于工作空间目录中而被隐藏”

    从eclipse左侧的 资源管理器 中右击选择 删除项目 的方式删除项目后 xff0c 右击 导入项目 导入原来删除了的同名项目时 xff0c 会无法导入项目 xff0c 显示 某些项目因位于工作空间目录中而被隐藏 原因 xff1a ecl
  • 继承中父类与子类的构造与析构顺序

    父类与子类的构造与析构顺序 继承中的顺序如下 xff1a 先构造父类 xff0c 在构造子类 析构顺序与构造顺序相反 span class token macro property span class token directive ke
  • 基于ROS+CANopen的SocketCAN驱动在Ubuntu下的应用说明

    基于ROS 43 CANopen的SocketCAN驱动在Ubuntu20 04 18 04上的应用说明 摘要 Abstract keywords 在Ubuntu 20 04或者18 04里 xff0c 运用ROS下的CANopen消息机制
  • HDFS详解一

    前言 xff1a 一 HDFS的一些基本概念 xff1a 数据块 xff08 block xff09 xff1a 大文件会被分割成多个block进行存储 xff0c block大小默认为128MB 每一个block会在多个datanode上
  • potplayer播放器没有声音的解决方案

    potplayer播放器没有声音的解决方案 最近突然发现电脑上的potplayer播放视频文件的时候只有图像没有声音了 xff0c 卸载后重装依旧如此 经一番摸索 xff0c 解决方法如下 1 在播放界面按一下 m 键 xff0c 可以开启
  • 解决Mysql安装之后没有my.ini配置文件问题

    详记MySql问题大全集 三 安装之后没有my ini配置文件怎么办 系列目录 一 安装MySql 二 安装并破解Navicat 三 没有my in配置文件怎么办 四 设置MySql的大小写敏感 五 重置MySql登陆密码 之前说过 xff
  • 一个简单的环形进度条组件 vue-circleprogressbar

    vue circleprogressbar 一个简单的环形进度条组件 最近在开发可视化大屏项目中经常会用到环形进度条 但是常用的echarts组件对环形进度条的支持不太好 写起来比较麻烦 就想着自己写一个VUE的环形组件 满足自己日常开发需
  • Hbuilder如何创建并运行Vue项目

    在Hbuilder中开发Vue项目是非常快捷的 xff0c 下面小编给大家分享一下如何在Hbuilder中创建并运行Vue项目 方法 步骤 1 首先打开Hbuilder创建一个新项目 xff0c 如下图所示 2 Hbuilder如何创建并运
  • 教大家防止Jar包被反编译

    xff08 待验证 xff09 方法就是 xff0c 向Jar注入无效代码 xff08 不合法的 xff0c 或者根本不是代码的字符串 xff09 那么无效的代码又怎么能正确运行呢 xff1f 答案就是 xff0c 你要保证你的代码永远不会
  • 推荐3个小程序开源组件库——Vant、iView、ColorUI

    推荐3个小程序开源组件库 在进行小程序开发时 xff0c 经常会遇到编写组件方面的阻碍 xff0c 这让我们花费大量的时间在页面以及 CSS 样式编写上 因此可以使用开源组件库 xff0c 有些复杂的组件可以直接拿来使用 xff0c 节省开
  • 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

    两种原因 第一种为程序的运行以平台系统位数不匹配 第二种则是该死的VS整出来的 一般在下面三种情景下会发生 1 64位系统上C 调用32位的C 43 43 dll 2 64位系统上IIS发布含有32位的 dll应用程序时 3 64位系统上编
  • 怎么进bios设置硬盘启动顺序|电脑bios硬盘启动设置方法

    怎么在BIOS里设置硬盘启动 xff1f 电脑在启动时会从硬盘寻找引导文件 xff0c 从而启动系统 xff0c 如果硬盘不是第一启动项 xff0c 或者有两个硬盘 xff0c 就会导致系统无法启动 xff0c 这时候就需要进BIOS设置硬
  • Windows计划任务执行时不显示窗口的问题

    最近开发了工具 xff0c 带界面的 xff0c 需要定时执行的 xff0c 为了方便直接用Windows计划任务做定时了 跑了一段时间发现 xff0c 进程中也有 xff0c 就是看不到程序的界面 xff0c 进程的执行貌似也阻塞了 从网
  • JAVA的@EXCEL导出导入常用注解汇总

    在实际开发中经常需要使用导入导出功能来加快数据的操作 在项目中可以使用注解来完成此项功能 在需要被导入导出的实体类属性添加 64 Excel注解 参数类型默认值描述sortintInteger MAX VALUE值越小越靠前readConv
  • MySQL中order by排序将NULL排在最前或最后面

    NULL的意思表示什么都不是 xff0c 或者理解成 未知 也可以 xff0c 它与任何值比较的结果都是false 注意 xff1a 默认情况下 xff0c MySQL会认为NULL值比其他类型的数据小 xff0c 也就是说 xff1a 在
  • C# 如何获取本机IP

    百度搜索的方案 如果你去百度C 如何获取本机IP xff0c 那么大概率的你会得到以下的几段代码 xff0c 第一种就是这样 xff1a string name 61 Dns GetHostName IPAddress ipadrlist
  • winform DevExpress contextMenuStrip右键事件

    span class token keyword private span span class token return type class name span class token keyword void span span sp
  • Linux TCP连接数限制配置

    在进行接口测试时 xff0c 在用户数超过400后 xff0c 就会出现socket connection reset xff0c 明显就是系统无法创建连接 xff0c 查看此时系统建立的TCP连接 xff0c netstat ant gr
  • 摘要认证及实现HTTP digest authentication

    最近工作需要做了摘要认证 xff08 digest authentication xff09 xff0c 下面就工作中遇到的问题及过程做一个总结 第一次客户端请求 GET POST 服务器产生一个随机数nonce xff0c 服务器将这个随