摘要认证及实现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
?
|