IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> http Digest认证计算方法整理 -> 正文阅读

[网络协议]http Digest认证计算方法整理

摘要认证及实现HTTP digest authentication - 简书

HTTP Basic和Digest认证介绍与计算 - 诸子流 - 博客园

不要不知道上面说的URI是什么意思啊

图解HTTP 第 8 章 确认访问用户身份的认证 - 简书8.1 何为认证 为了弄清究竟是谁在访问服务器,就得让对方的客户端自报家门。 可是,就算正在访问服务器的对方声称自己是ueno,身份是否属实这 点却也无从谈起。为确认 uen...https://www.jianshu.com/p/c78f9e19801a

这个图里面也明确有写URI? 可以看出就是GET后面那部分? 当然除开HTTP/1.1

Http auth认证的两种方式Basic方式和 Digest认证_Virgil_K2017的博客-CSDN博客

怪不得这里还要输入URL

在线生成Digest Auth、http基础认证密码生成、 Digest authentication在线生成、Digest Auth在线hash生成--查错网

HTTP Basic和Digest认证介绍与计算 - 诸子流 - 博客园

后来再地铁上看了下这个感觉还是挺简单的,最终就是计算出response??? HA1 HA2都是为了计算出response准备的。

http digest - 简书

这有专门进行MD5加密的网站

md5加密,sha1加密--md5在线解密

有找到MD5的C库

C版本MD5库_md5库,cmd5-C代码类资源-CSDN下载

所以最后回复的报文形式是什么样的

注意是计算MD5哈希值

http digest - 简书

怪不得MD5的C库的readme是说用这个函数

C版本MD5库_md5库,cmd5-C代码类资源-CSDN下载

?所以这里写着哈希?

?md5加密,sha1加密--md5在线解密

实际服务器返回的有这些

 
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest realm="Login to FH0427PAZ00039",qop="auth",nonce="576250586",opaque="ecd96bfa32ed521cda6e9a8ed1701e6b3ef687d0"
Connection: close
CONTENT-LENGTH: 0

这里说必须包含这几个,返回的时候,实际可以看到顺序似乎没有那么严格

图解HTTP 第 8 章 确认访问用户身份的认证 - 简书

?这个列了这些

http digest - 简书

这个有这几个

https://www.jianshu.com/p/c78f9e19801a

HTTP认证之摘要认证——Digest(一) - xiaoxiaotank - 博客园

cnonce是什么

客户端也要生成随机数么,是否可以不写或者乱写。

HTTP Basic和Digest认证介绍与计算 - 诸子流 - 博客园

http digest鉴权 - ostin - 博客园

服务器允许在一小段时间内使用同一个随机数。

HTTP认证之摘要认证——Digest(一) - xiaoxiaotank - 博客园

计算response的时候要用到nc和cnonce? cnonce全程是clientnonce就是客户端的随机数。

那这样就好理解了,这两个数传给服务端是有意义的,服务端要用这个来计算,也就是这个response的结果包含了服务器端和客户端的数才能算出来。那既然是客户端的数,那自己随便写也没什么太大影响了?

摘要认证及实现HTTP digest authentication - 简书

这么看的话发回给服务器的确实要有或者说必须有下面这几个数字 除开response,其他的都是用来计算response的,一个都不能少。

假设就是这个吧

Authorization:Digest  realm="some realm", (服务端给了)
username="xxxx",(服务端给了)
nonce="xxxx",(服务端给了)
uri="/xxx",(已知)
algorithm=MD5,(已知)
response="xxxx",(需要自己计算,也主要是计算这个)
qop=auth,(服务端给了)
nc=000001,(自己随便写?一般看到就是000001)
cnonce="xxxx"(自己随便写?)

URI我可以确定就是GET后面那串 除开HTTP/1.1

拍自《图解HTTP》 P173

这里也可以看出来

我目前的计算方法应该就是? 还有这里面的method写什么?

?

?

method似乎指 GET 那怪不得A2写成method:URI? 那不就是GET:....了么,这样感觉都可以不用死记了。(我后面手算了一个例子,也证明这个method就是GET,至少在用GET的时候是GET)

http协议之digest(摘要)认证_jszj的专栏-CSDN博客_digest

?http digest - 简书

这里要选GET的意义可能也在这里

在线生成Digest Auth、http基础认证密码生成、 Digest authentication在线生成、Digest Auth在线hash生成--查错网

这个给出了从响应报文里面提取相应信息的函数!!!!!!!!!!!!!

数组名或者字符串名应该就是地址了,把字符串名直接放进去应该就可以了。

http digest认证过程分析及例子(这个给出了提取函数)_TYINY的博客-CSDN博客https://blog.csdn.net/sinat_16643223/article/details/120246611

?



    //函数功能:生成随机字符串

    //函数参数:生成随机字符串的长度

    //返回值:成功返回随机字符串

    char *createRandomNum(int N)

    {

    int flag;

    int k=0,j=0;

    char *random_str = (char*)malloc(N+1);

    random_str[0] = '\0';

    //1970到现在的时间sec作为种子

    unsigned int seed = (unsigned)time(NULL);

    srand(seed);

    for(j=0;j<N;j++)

    {

    unsigned int random_num = rand();

    flag = random_num%3;

    if(flag == 0)

    {

    random_str[k++]='0'+random_num%10;

    }

    else if(flag == 1)

    {

    random_str[k++]='a'+random_num%26;

    }

    else if(flag == 2)

    {

    random_str[k++]='A'+random_num%26;

    }

    srand(random_num);

    }

    random_str[k]='\0';

    return random_str;

    }



    //函数功能:获取子串

    //函数参数:source目标字符串;start_str开始字符串;end_chr结束字符

    //返回值:成功返回该子串,失败返回NULL

    char* GetTargetStr(const char*source,char*start_str,char end_chr)

    {

    char *p_start = NULL;

    char *p_end = NULL;

    p_start = strstr(source,start_str);

    p_start += strlen(start_str);

    p_end = strchr(p_start,end_chr);

    char *ret = NULL;

    if(p_end != NULL)

    {

    ret = (char*)malloc(p_end - p_start +1);

    ret[p_end - p_start] = '\0';

    memcpy(ret,p_start,p_end - p_start);

    }

    return ret;

    }

    //函数功能:获取WWW_Authenticate认证信息

    //函数参数:self通信句柄;HttpRsp服务器响应数据包;HttpRspSize数据包的尺寸;head_len头长度;user登陆用户名;pwd用户密码

    //返回值:成功返回OK,失败

    //备注:该函数中nc的值,这里客户端不保存服务器发送的nonce,所以每次都是00000001

    char *GetClientWWW_Authenticate(const char*response,long responseSize,int head_len\

    ,const char*user,const char*pwd)

    {

    char *realm = GetTargetStr(response,"realm=\"",'\"');

    char *nonce = GetTargetStr(response,"nonce=\"",'\"');

    char *algorithm = GetTargetStr(response,"algorithm=",',');

    char *qop = GetTargetStr(response,"qop=\"",'\"');
     

    assert(realm && nonce && algorithm && qop);

    //FIXME

    char *nc = "00000001";

    char *cnonce = createRandomNum(32);//需要生成随机字符串
     

    char A1[100] = {0};

    sprintf(A1,"%s:%s:%s",user,realm,pwd);

    char *md5_A1 = MD5_sign((unsigned char*)A1,strlen(A1));
     

    char A2[80] = {0};

    sprintf(A2,"GET:/Auth");

    char *md5_A2 = MD5_sign((unsigned char*)A2,strlen(A2));
     

    char contact[512] = {0};

    sprintf(contact,"%s:%s:%s:%s:%s:%s",md5_A1,nonce,nc,cnonce,qop,md5_A2);

    FREE_MALLOC(md5_A1);

    FREE_MALLOC(md5_A2);
     

    char *rsp = MD5_sign((unsigned char*)contact,strlen(contact));

    char WWW_Authenticate[256] = {0};

    char*format = "Digest username=\"%s\",realm=\"%s\",qop=\"%s\",algorithm=\"%s\",uri=\"/Auth\",nonce=\"%s\",nc=%s,cnonce=\"%s\",response=\"%s\"";

    sprintf(WWW_Authenticate,format,user,realm,qop,algorithm,nonce,nc,cnonce,rsp);
     

    FREE_MALLOC(realm);

    FREE_MALLOC(qop);

    FREE_MALLOC(algorithm);

    FREE_MALLOC(nonce);

    FREE_MALLOC(cnonce);

    FREE_MALLOC(rsp);

    return strdup(WWW_Authenticate);

    }

该文最后服务器没有返回Authorization头域,这个也可以的,只是不够规范。

http digest认证过程分析及例子_希哈科技的博客-CSDN博客

现在再看这个就明晰了,这些要填的都是必不可少的,最后说生成哈希,确实是生成哈希,我们可以先拿这个算

在线生成Digest Auth、http基础认证密码生成、 Digest authentication在线生成、Digest Auth在线hash生成--查错网

突然发现我昨天用windows自带浏览器edge

看到的带有Authorization的报文信息正是一个完整的算好response的!!!!!!!

这是不是再次验证了这点,就是缺这个Digest验证了!!!!

从这个报文信息也可以看出

realm的值确实就是 Login to FH0427PAZ00039

我们可以参照这个标准格式来写。

GET /cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20 HTTP/1.1
Host: 192.168.42.108
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Authorization: Digest username="admin", realm="Login to FH0427PAZ00039", nonce="1298797490", uri="/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20", response="9a6ad1c876734b41a6f785a7389ade62", opaque="ecd96bfa32ed521cda6e9a8ed1701e6b3ef687d0", qop=auth, nc=00000002, cnonce="522e610057899296"
Connection: keep-alive
Cookie: VSLangCookie30=SimpChinese; username=admin; showIVSRule=false; VSWebClientSessionID=64481279; VSVideoWHMode=Adaptive%20Window
Upgrade-Insecure-Requests: 1

我用这个网站根据上面信息生成的response和上面一样!!

在线生成Digest Auth、http基础认证密码生成、 Digest authentication在线生成、Digest Auth在线hash生成--查错网

我想再自己手动计算一遍

HA1=MD5(admin:Login to FH0427PAZ00039:123456)=383c012bcbbe9ffec12341d6ca429a54

HA2=MD5(GET:/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20)=3c87b2218a4e2a849be6739cc61b36c9

response=MD5(383c012bcbbe9ffec12341d6ca429a54:1298797490:00000002:522e610057899296:auth:3c87b2218a4e2a849be6739cc61b36c9)=9a6ad1c876734b41a6f785a7389ade62

我最后算的结果和这个一样,说明我理解的没错?? method那个就是填GET

下面这似乎可以看出MD5不区分大小写

MD5在线加密/解密/破解—MD5在线

?现在知道这里说的md5_middle什么意思了,16位 MD5和32位 MD5区别是取的是8~24位。

md5加密,sha1加密--md5在线解密

?

?

再发给服务器的时候按照这个格式发吧,就重新计算后替换掉Authorization那一行就可以了

用这个网站快速计算,而且自动给你生成Authorization的格式,应该直接复制粘贴进去就好。在线生成Digest Auth、http基础认证密码生成、 Digest authentication在线生成、Digest Auth在线hash生成--查错网

GET /cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20 HTTP/1.1
Host: 192.168.42.108
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Authorization: Digest username="admin", realm="Login to FH0427PAZ00039", nonce="1298797490", uri="/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20", response="9a6ad1c876734b41a6f785a7389ade62", opaque="ecd96bfa32ed521cda6e9a8ed1701e6b3ef687d0", qop=auth, nc=00000002, cnonce="522e610057899296"
Connection: keep-alive
Cookie: VSLangCookie30=SimpChinese; username=admin; showIVSRule=false; VSWebClientSessionID=64481279; VSVideoWHMode=Adaptive%20Window
Upgrade-Insecure-Requests: 1

现在还有一个问题,空格占不占字节数?

先给吊舱发这个,也是昨天发的

GET /cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20 HTTP/1.1
Host: 192.168.42.108
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.38
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Authorization:Basic YWRtaW46MTIzNDU2
Cookie: VSLangCookie30=SimpChinese; username=admin; showIVSRule=false

得到的回应


HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest realm="Login to FH0427PAZ00039",qop="auth",nonce="1555448628",opaque="ecd96bfa32ed521cda6e9a8ed1701e6b3ef687d0"
Connection: close
CONTENT-LENGTH: 0


第二次给吊舱发,替换掉AUthorization

GET /cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20 HTTP/1.1
Host: 192.168.42.108
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Authorization: Digest username="admin",
					realm="Login to FH0427PAZ00039",
					nonce="1555448628",
					uri="/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20",
					algorithm="MD5",
					qop=auth,
					nc=00000001,
					cnonce="522e610057899297",
					response="bb9ebe40094abc43844c8a0d501d746f",
					opaque="ecd96bfa32ed521cda6e9a8ed1701e6b3ef687d0"
Connection: keep-alive
Cookie: VSLangCookie30=SimpChinese; username=admin; showIVSRule=false; VSWebClientSessionID=64481279; VSVideoWHMode=Adaptive%20Window
Upgrade-Insecure-Requests: 1
GET /cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20 HTTP/1.1
Host: 192.168.42.108
Authorization: Digest username="admin",
					realm="Login to FH0427PAZ00039",
					nonce="13123270",
					uri="/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20",
					algorithm="MD5",
					qop=auth,
					nc=00000004,
					cnonce="522e610057899296",
					response="4f2ed20b576761e7204b080ba08096b6",
					opaque="ecd96bfa32ed521cda6e9a8ed1701e6b3ef687d0"
Connection: keep-alive

https://blog.csdn.net/sinat_16643223/article/details/120246611

现在 再看这里说的认证就看得懂了!!!!!!!!!!!!!!!

我觉得应该是有别人现成的代码的,用的这么多没道理没有啊

这个代码细看了下计算方法和我的是一样的,应该可以用

httpauth: #http协议之digest(摘要)认证 用于RTSP、SIP中的注册/呼叫认证##digest的算法: A1 = username:realm:password A2 = mthod:uriHA1 = MD5(A1) 如果 qop 值为“auth”或未指定,那么 HA2 为 HA2 = MD5(A2)=MD5(method:uri) 如果 qop 值为“auth-int”,那么 HA2 为 HA2 = MD5(A2)=MD5(method:uri:MD5(entityBody))如果 qop 值为“auth”或“auth-int”,那么如下计算 response: response = MD5(HA1:nonce:nc:cnonce:qop:HA2)如果 qop 未指定,那么如下计算 response: response = MD5(HA1:nonce:HA2)##功能实现 ###MD5 void md5(const uint8_t initial_msg, size_t initial_len, uint8_t digest); ###digest认证 int

编译出现未定义的应用说明没有找到这个函数体的实现,一般是make的时候没有链接。虽然只是个warning,但是不能忽视。

我把栈空间改到50M还是说有段错误

按照下面两篇博文来改的

Linux下运行C++程序出现"段错误(核心已转储)"的原因 - 白日焰火 - 博客园

linux查看修改线程默认栈空间大小(ulimit -s)_七点钟123的博客-CSDN博客

出现段错误不用怕,一行一行注释掉,看到底哪行引起的段错误,我就是这样找到出现段错误的地方并且不用那个函数了。

我把数值调整程一样可以验证我代码里MD5的计算没有错。 和下面这个结果是完全一样的,最后response的值

GET /cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20 HTTP/1.1
Host: 192.168.42.108
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Authorization: Digest username="admin", realm="Login to FH0427PAZ00039", nonce="1298797490", uri="/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20", response="9a6ad1c876734b41a6f785a7389ade62", opaque="ecd96bfa32ed521cda6e9a8ed1701e6b3ef687d0", qop=auth, nc=00000002, cnonce="522e610057899296"
Connection: keep-alive
Cookie: VSLangCookie30=SimpChinese; username=admin; showIVSRule=false; VSWebClientSessionID=64481279; VSVideoWHMode=Adaptive%20Window
Upgrade-Insecure-Requests: 1

MD5最后就是得到32个十六进制数

摘要认证及实现HTTP digest authentication_大大的CDream-CSDN博客

一直没明白它这是怎么弄的

这有个也是云台,也是网页,也是digest认证。

curl第六课 Http Digest Auth认证应用_weixin_33810302的博客-CSDN博客

这么搜一下还真是有一些。

这个realm也是 login to 、、、

https://www.baidu.com/link?url=hIFufPxhq0Q8RqUb7HHqXEYgzqyaD0nsg1nRQs3pvj22DDRiLibS1vQj1noMy5H8FJUM8r2VtiPCQ5lwuH5EhoXz1hnNfFHAtelAs7FhA8nWdMLpb53MJFhi_CL3JeC6&wd=&eqid=b59cbac90031a5ac00000002613e0eec

感觉海康威视的云台用起来感觉也差不多,是不是云台吊舱这类基本都是这种配置方法。digest可能也是标配。

海康威视摄像头HTTP接口能力调研材料.doc

以摘要认证(Digest Authentication)方式伪登录某摄像头_乱七八糟の中转站-CSDN博客

网络摄像头rtsp协议登录认证 - 走看看

?

认证的nonce确实有超时一说,至少海康摄像头这样,我估计其他可能也差不多

?海康确实在这方面可以找到比较官方而且详细的资料

细看下海康还是符合digest协议的,那么视辉的应该也是符合的。

虽然它有的发的和那个HTTP文档的很像

关于海康摄像头的摘要认证_y673533511的博客-CSDN博客

这个人 还提供了源码,真的是非常良心了,明天可以自己试试,他用了这个我今天也找到的httpauth

他它似乎有更现成的代码,明天跑跑看。

hivisoion_projcet/digest/src at master · kyhkl/hivisoion_projcet · GitHub

?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-13 09:37:35  更:2021-09-13 09:39:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:22:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码