http Digest认证计算方法整理

2023-05-16

摘要认证及实现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在线https://www.sojson.com/encrypt_md5.html

 现在知道这里说的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

它的代码是有从收到的响应报文里面提取nonce这个的。

digest/src/httpauth.c · 马熙/hivisoion_projcet - Gitee

 digest/src/tcp_client.c · 马熙/hivisoion_projcet - Gitee.com

其实多个c文件的gcc也好写。

我目前  HTTP报文助手发送   HTTP代码一发送  海康威视更改代码发送,都不行,第二次法国去服务器返回来的都是没有认证成功。前两个MD5我都严格计算过,感觉有必要问一下他们的认证方式

细看这个cnonce也给的,那可以自己算

HA1=MD5(admin:VS\u 00408CA5EA04:admin)=44ada65f3a5976994a663120fe07b033

HA2=MD5(GET:/cgi-bin/magicBox.cgi?action=getLanguageCaps)=006035d2cf23aa4c834e43bb0861ad19

response=MD5(HA1:000562fdY631973ef04f77a3ede7c1832ff48720ef95ad:00000001:0a4f113b:auth:HA2)

response=MD5(44ada65f3a5976994a663120fe07b033:000562fdY631973ef04f77a3ede7c1832ff48720ef95ad:00000001:0a4f113b:auth:006035d2cf23aa4c834e43bb0861ad19)=3db2c0f0481392e9ebe8b3e80da61b69

 

算出的response居然不一样,难道密码不同?

这个网站计算出的和我算出的一样,那个opaque应该是没用上的

我把URI里额一个问号改了下英文的问号response就不一样了,这种细节也注意下。

这里看到可以选择RTSP的认证方式

 

 默认选的Digest,我选择改为无试试。

现在知道为什么叫login to 这个名字了。

ONVIF这个似乎也之前见过啊,默认认证开启。

 摄像机ONVIF登录校验开启的好与坏_易家电子-(www.ejdz.cn)

 

 Onvif鉴权实现方式 - 静之深 - 博客园

 我现在把上面两个认证都关掉看看(还是需要登录,就是改帧率的那个链接)

手动输入用户名密码登录这样报文里面可以看到authorization了

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
Cache-Control: max-age=0
Authorization: Digest username="admin", realm="Login to FH0427PAZ00039", nonce="296446132", uri="/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20", response="c1b7de2fc55f709a5683626259b86398", opaque="ecd96bfa32ed521cda6e9a8ed1701e6b3ef687d0", qop=auth, nc=00000002, cnonce="d1143f7c8b561254"
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.44
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
Cookie: VSLangCookie30=SimpChinese; username=admin; showIVSRule=false

我用这个网站算了下,生成的response是一样的

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

我还在这里添加了一个IP白名单,原本什么都没有,这个IP是我自己电脑上设定的固定的本地IP

白名单看了下是这个意思,以为可以免登陆,实际不是的,那就算了,我又删掉了。等没有设置这个。

stale是表示nonce是否过期

关于海康摄像头的摘要认证 - it610.com

注意有时候提取的随机数不对

第一次看到回复OK.

maxi@maxi:~/linux_udp_tcp_maxi_test/HTTP/hivisoion_projcet/digest/src$ ./app 192.168.42.108 80
连接服务器成功
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
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


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

the servers return 401 
连接服务器成功
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
Cache-Control: max-age=0
Authorization: Digest username="admin", realm="Login to FH0427PAZ00039", nonce="1035369453", uri="/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20", response="e3a30694ef547d6ad3e2a30af0de6dc6", qop=auth, nc=00000001, cnonce="1035369457899296"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


HTTP/1.1 200 OK
Content-type: text/plain;charset=utf-8
CONNECTION: close
CONTENT-LENGTH: 43

Error
ErrorID=0, Detail=Invalid Authority!
buflen is 141 
rs is 1 
HTTP/1.1 200 OK
Content-type: text/plain;charset=utf-8
CONNECTION: close
CONTENT-LENGTH: 43

Error
ErrorID=0, Detail=Invalid Authority!
buflen is 0 
段错误 (核心已转储)
maxi@maxi:~/linux_udp_tcp_maxi_test/HTTP/hivisoion_projcet/digest/src$ 

我刚刚又发了一次,也是回复OK

maxi@maxi:~/linux_udp_tcp_maxi_test/HTTP/hivisoion_projcet/digest/src$ ./app 192.168.42.108 80
连接服务器成功
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
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


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

the servers return 401 
连接服务器成功
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
Cache-Control: max-age=0
Authorization: Digest username="admin", realm="Login to FH0427PAZ00039", nonce="1238078794", uri="/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20", response="7207e5a707b3ba74562410ba753801e5", qop=auth, nc=00000001, cnonce="1238078757899296"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


HTTP/1.1 200 OK
Content-type: text/plain;charset=utf-8
CONNECTION: close
CONTENT-LENGTH: 43

Error
ErrorID=0, Detail=Invalid Authority!
buflen is 141 
rs is 1 
HTTP/1.1 200 OK
Content-type: text/plain;charset=utf-8
CONNECTION: close
CONTENT-LENGTH: 43

Error
ErrorID=0, Detail=Invalid Authority!
buflen is 0 
段错误 (核心已转储)
maxi@maxi:~/linux_udp_tcp_maxi_test/HTTP/hivisoion_projcet/digest/src$

这是服务器第二次回复的报文的内容

HTTP/1.1 200 OK
Content-type: text/plain;charset=utf-8
CONNECTION: close
CONTENT-LENGTH: 43

Error
ErrorID=0, Detail=Invalid Authority!

现在的情况是我登陆成功了但是似乎没有权限改,这个HTTP相机协议.pdf里面有讲

Error
ErrorID=0, Detail=Invalid Authority!
buflen is 141

digest认证失败一般是因为nonce的数值提取得有问题,细看就会发现这点。这个代码目前有时候提取正确,有时候提取不正确。如果提取正确的话,是可以digest认证成功,返回OK。有时候提取出来的服务器随机数总是多出个3

maxi@maxi:~/linux_udp_tcp_maxi_test/HTTP/hivisoion_projcet/digest/src$ ./app 192.168.42.108 80
连接服务器成功
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
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


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

the servers return 401 
连接服务器成功
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
Cache-Control: max-age=0
Authorization: Digest username="admin", realm="Login to FH0427PAZ00039", nonce="6382002353", uri="/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20", response="0552d2540cec5a2f4c36da79cd05ab39", qop=auth, nc=00000001, cnonce="6382002357899296"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


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

buflen is 204 
rs is 1 
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest realm="Login to FH0427PAZ00039",qop="auth",nonce="332800269",opaque="ecd96bfa32ed521cda6e9a8ed1701e6b3ef687d0"
Connection: close
CONTENT-LENGTH: 0

buflen is 0 
段错误 (核心已转储)
maxi@maxi:~/linux_udp_tcp_maxi_test/HTTP/hivisoion_projcet/digest/src$ 
maxi@maxi:~/linux_udp_tcp_maxi_test/HTTP/hivisoion_projcet/digest/src$ ./app 192.168.42.108 80
连接服务器成功
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
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


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

the servers return 401 
连接服务器成功
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
Cache-Control: max-age=0
Authorization: Digest username="admin", realm="Login to FH0427PAZ00039", nonce="4151400413", uri="/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20", response="4b2dc5a9319be2c87fbd87e681318966", qop=auth, nc=00000001, cnonce="4151400457899296"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


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

buflen is 204 
rs is 1 
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest realm="Login to FH0427PAZ00039",qop="auth",nonce="516759653",opaque="ecd96bfa32ed521cda6e9a8ed1701e6b3ef687d0"
Connection: close
CONTENT-LENGTH: 0

buflen is 0 
段错误 (核心已转储)

我可能今天早上改好后没有多试几次?没有细看是否提取正确?

能够digest认证成功的代码是这里最新提交的,也是上午提交的。改为符合视辉吊舱的的代码。

  就是这个版本的

我新建一个用户好像也不行。

我用我新建的maxi这个用户登陆也是改不了。

用admin admin登陆也是的,所以是不是我用户名密码的问题?还是什么?、

看了下似乎是用户名密码错误,这样可以通过digest认证但是改不了东西?

讲道理正常返回的报文应该是这样的对吧。

确实我用错误的密码,也是可以显示HTTP OK, 后面显示用户没有权限。所以这种情况是个什么意思呢,digest是认证成功了还是没有成功?

我实际自己算了下,算出的response不一样,需要找下问题。

看了下它的HA1  HA2都没有算错,最后的response算错了,找找为什么

我打印了下计算response MD5前的那个字符串,确实发现问题了。

应该写qop 写auth的地方出问题了,可能是提取qop提取不对,那就不提取嘛,本身就是auth

改了之后现在字符串是看着正常了

现在算是吻合了 ,现在MD5的计算没有问题了,response也没有问题了。

但是还是出现invalid Authority!

我现在换成用户maxi   密码123456后改成功了!!!!
我是先在浏览器上这么操作,发现现在maxi可以改了,之前还不行的

我再再代码里改称maxi,注意有个地方可能漏改,这里的也需要改成maxi

 += sprintf(&buf[pos], "Authorization: Digest username=\"maxi\", realm=\"Login to FH0427PAZ00039\", nonce=\"%s\", uri=\"/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20\", response=\"%s\", qop=auth, nc=00000001, cnonce=\"%s\"\r\n",auth->nonce,auth->response,auth->cnonce);

这是历史系的时刻

maxi@maxi:~/linux_udp_tcp_maxi_test/HTTP/hivisoion_projcet/digest/src$ make
gcc httpauth.c tcp_client.c -o app
maxi@maxi:~/linux_udp_tcp_maxi_test/HTTP/hivisoion_projcet/digest/src$ ./app 192.168.42.108 80
连接服务器成功
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
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


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

the servers return 401 
连接服务器成功
HA1 = 3c0b178fab08c1089296a0f93c447190
HA2 = 3c87b2218a4e2a849be6739cc61b36c9
response未计算DM5前: 3c0b178fab08c1089296a0f93c447190:1535872314:00000001:1535872357899296:auth:3c87b2218a4e2a849be6739cc61b36c9
response = aa140f49a2e9e2cad8ce38e63a73aec1
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
Cache-Control: max-age=0
Authorization: Digest username="maxi", realm="Login to FH0427PAZ00039", nonce="1535872314", uri="/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=20", response="aa140f49a2e9e2cad8ce38e63a73aec1", qop=auth, nc=00000001, cnonce="1535872357899296"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


HTTP/1.1 200 OK
Content-type: text/plain;charset=utf-8
CONNECTION: close
CONTENT-LENGTH: 3

OK
buflen is 100 
rs is 1 
HTTP/1.1 200 OK
Content-type: text/plain;charset=utf-8
CONNECTION: close
CONTENT-LENGTH: 3

OK
buflen is 0 
段错误 (核心已转储)
maxi@maxi:~/linux_udp_tcp_maxi_test/HTTP/hivisoion_projcet/digest/src$ 

我是先严格检测了这个代码MD5的计算,确保MD5的计算是正确的,再把用户改为非admin用户。这回就OK了。当然还有提取服务器的随机数有时候不对这个也需要解决一下。

今天是最开始发现,这个海康威视这版代码,有时候能让服务器反馈HTTP OK,虽然后面是inavlid aut...但总比一直返回401好些啊

目前能成功修改帧率的代码我上传到gitee了

https://gitee.com/maxibooksiyi/linux_udp_tcp_maxi_test/commit/89f70c3a60c22c13babe375d260802bcd9e89d09

昨天的代码不行我估计是那个基础的HTTP代码可能两次HTTP通信不是连着的?或者用户不能是admin?我改成maxi试试,昨天的代码我也是严格确认MD5的计算是正确的。

刚刚把昨天用的代码版本(HTTP/例程一)用户名改称maxi了,试了下,还是不行,帧率没有改成。

2021。9。17

要是重新出现没有修改权限(吊舱层面的,不是http digest认证),尝试很多次还是这样,原版不动的代码。可以试一下重启下吊舱。可能就好了,今天下午出现了这么一次。

2021.9.19

还是来解决一下这个提取nonce出问题的事情

接收到的需要更改的帧率是:21
连接服务器成功
GET /cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=21 HTTP/1.1
Host:192.168.42.108
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


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

the servers return 401 
从响应报文提取出的nonce:8656468523
连接服务器成功
GET /cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=21 HTTP/1.1
Host:192.168.42.108
Connection: keep-alive
Cache-Control: max-age=0
Authorization: Digest username="maxi", realm="Login to FH0427PAZ00039", nonce="8656468523", uri="/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=21", response="6804ad7c56b34e94b12c64443f39084f", qop=auth, nc=00000001, cnonce="8656468557899296"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


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

buflen is 204 
rs is 0 
结束了

把begin和end打印出来

begin和end都没有问题,为什么最后会多出一个83  是不是因为最后没有价格字符串的结束标志?就是原本auth->nonce这个字符串长度是64,里面很可能是有值的,就像打印字符串,后面没有结束标志它可能把后面的一些也连着打出来了。这个或许是关键?

所以我觉得这个赋值完了之后可以加个字符串提取函数。把多的截断。

或者后面再赋值个字符串结束的字符。是的,我在结尾赋值'\0',现在试了几次能做到百分之百更改成功了。

接收到的需要更改的帧率是:21
连接服务器成功
GET /cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=21 HTTP/1.1
Host:192.168.42.108
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


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

the servers return 401 
从响应报文提取出的nonce:3977421983
从响应报文提取出的begin:"39774219",opaque="ecd96bfa32ed521cda6e9a8ed1701e6b3ef687d0"
Connection: close
CONTENT-LENGTH: 0


从响应报文提取出的end:",opaque="ecd96bfa32ed521cda6e9a8ed1701e6b3ef687d0"
Connection: close
CONTENT-LENGTH: 0


连接服务器成功
GET /cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=21 HTTP/1.1
Host:192.168.42.108
Connection: keep-alive
Cache-Control: max-age=0
Authorization: Digest username="maxi", realm="Login to FH0427PAZ00039", nonce="3977421983", uri="/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Video.FPS=21", response="51a618cc031aeb392dd7e2546235b826", qop=auth, nc=00000001, cnonce="3977421957899296"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


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

buflen is 204 
rs is 0 
结束了

字符串最后一个字符 是 \0 似乎。

字符串结束标志(划重点)

字符串是一系列连续的字符的组合,要想在内存中定位一个字符串,除了要知道它的开头,还要知道它的结尾。找到字符串的开头很容易,知道它的名字(字符数组名或者字符串名)就可以;然而,如何找到字符串的结尾呢?C语言的解决方案有点奇妙,或者说有点奇葩。

在C语言中,字符串总是以'\0'作为结尾,所以'\0'也被称为字符串结束标志,或者字符串结束符。

'\0'是 ASCII 码表中的第 0 个字符,英文称为 NUL,中文称为“空字符”。该字符既不能显示,也没有控制功能,输出该字符不会有任何效果,它在C语言中唯一的作用就是作为字符串结束标志。

C语言在处理字符串时,会从前往后逐个扫描字符,一旦遇到'\0'就认为到达了字符串的末尾,就结束处理。'\0'至关重要,没有'\0'就意味着永远也到达不了字符串的结尾。

" "包围的字符串会自动在末尾添加'\0'。例如,"abc123"从表面看起来只包含了 6 个字符,其实不然,C语言会在最后隐式地添加一个'\0',这个过程是在后台默默地进行的,所以我们感受不到。

下图演示了"C program"在内存中的存储情形:



需要注意的是,逐个字符地给数组赋值并不会自动添加'\0',例如:


  
  1. char str[] = {'a', 'b', 'c'};

数组 str 的长度为 3,而不是 4,因为最后没有'\0'

当用字符数组存储字符串时,要特别注意'\0',要为'\0'留个位置;这意味着,字符数组的长度至少要比字符串的长度大 1。请看下面的例子:


  
  1. char str[7] = "abc123";

"abc123"看起来只包含了 6 个字符,我们却将 str 的长度定义为 7,就是为了能够容纳最后的'\0'。如果将 str 的长度定义为 6,它就无法容纳'\0'了。

当字符串长度大于数组长度时,有些较老或者不严格的编译器并不会报错,甚至连警告都没有,这就为以后的错误埋下了伏笔,读者自己要多多注意。

有些时候,程序的逻辑要求我们必须逐个字符地为数组赋值,这个时候就很容易遗忘字符串结束标志'\0'。下面的代码中,我们将 26 个大写英文字符存入字符数组,并以字符串的形式输出:


  
  1. #include <stdio.h>
  2. int main(){
  3. char str[30];
  4. char c;
  5. int i;
  6. for(c=65,i=0; c<=90; c++,i++){
  7. str[i] = c;
  8. }
  9. printf("%s\n", str);
  10. return 0;
  11. }

在 VS2015 下的运行结果:

ABCDEFGHIJKLMNOPQRSTUVWXYZ口口口口i口口0 ?

表示无法显示的特殊字符。

现在可以做到每次百分之百digest认证成功了,因为保证了nonce提取的正确,其实那个提取函数prase_response没有问题,仔细分析了下它的逻辑,还有我用printf打印出begin end,发现提取的位置没有问题,但是打印出的nonce就是有时候比真在的nonce多出一两个字符,我又看到这个代码定义的nonce的字符串长度是64,那么我想到是不是之前出现过的类似情况,字符串最末为没有字符串结束字符,导致把后面的也接着打印出来了,我开始想加个字符串截断函数,后来还是选择就在字符串应该结束的位置后面一位赋值'\0',知道是赋值这个也是看了:C语言字符数组和字符串_C语言中文网 ,也就是在之前代码的基础上加了这句  auth->nonce[end-begin-1]={'\0'};  然后编译再运行,果然就每次都更改成功了,没有再出现因为nonce提取错误导致有时候digest认证不成功的情况,现在也明白为什么总是提取出的nonce比真在的nonce多出个3或者83等等的原因了,其实提取得正确,就是缺少字符串结束字符,没有这个结束字符,你正确的字符串在使用的时候就可能被别人误读,多取,导致出现这种情况。

2021.9.27

我们浏览网页通常不加端口号是什么原因? - 知乎

 

偏偏抓图这里要写一个端口号,我觉得就是改端口号就够了,digest认证里面并不涉及到端口号啊。

2021.9.28

图片报文也传回来了只是最后出现段错误。

更改分辨率两次HTTP请求操作结束
=======================================================================
连接服务器成功
GET /cgi-bin/snapshot.cgi? HTTP/1.1
Host:192.168.42.108
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


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

the servers return 401 
从响应报文提取出的nonce:2071764994
从响应报文提取出的begin:"2071764994",opaque="ecd96bfa32ed521cda6e9a8ed1701e6b3ef687d0"
Connection: close
CONTENT-LENGTH: 0


从响应报文提取出的end:",opaque="ecd96bfa32ed521cda6e9a8ed1701e6b3ef687d0"
Connection: close
CONTENT-LENGTH: 0


连接服务器成功
GET /cgi-bin/snapshot.cgi? HTTP/1.1
Host:192.168.42.108
Connection: keep-alive
Cache-Control: max-age=0
Authorization: Digest username="maxi", realm="Login to FH0427PAZ00039", nonce="2071764994", uri="/cgi-bin/snapshot.cgi?", response="8eaa83187917c80f195bddb57b0c6b78", qop=auth, nc=00000001, cnonce="2071764957899296"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 94888 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 5792 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 4344 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 2128 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 5792 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 5792 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 5792 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 5792 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 4344 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 2591 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 199388

����buflen is 0 
[gimbal_vsheen_http-2] process has died [pid 10223, exit code -11, cmd /home/maxi/catkin_ws2/devel/lib/gimbal_control/gimbal_vsheen_http __name:=gimbal_vsheen_http __log:=/home/maxi/catkin_ws2/log/ffe214b6-2003-11ec-be86-84a93e05fc60/gimbal_vsheen_http-2.log].
log file: /home/maxi/catkin_ws2/log/ffe214b6-2003-11ec-be86-84a93e05fc60/gimbal_vsheen_http-2*.log

digest认证应该成功了,就是这个图片报文的处理。

这里有满时就停止录像

SD卡上是有截图的保存的,我刚才发送URL是成功了的

 10 对应十点,25  32  53对应分钟应该就是我刚才弄的三次,第一次是通过浏览器,第二次第三次是通过代码发送的url。

初步实现把传回的图片保存到本地。

 

记录一次完整的图片接收报文

=======================================================================
连接服务器成功
GET /cgi-bin/snapshot.cgi? HTTP/1.1
Host:192.168.42.108
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


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

the servers return 401 
从响应报文提取出的nonce:283823519
从响应报文提取出的begin:"283823519",opaque="ecd96bfa32ed521cda6e9a8ed1701e6b3ef687d0"
Connection: close
CONTENT-LENGTH: 0


从响应报文提取出的end:",opaque="ecd96bfa32ed521cda6e9a8ed1701e6b3ef687d0"
Connection: close
CONTENT-LENGTH: 0


连接服务器成功
GET /cgi-bin/snapshot.cgi? HTTP/1.1
Host:192.168.42.108
Connection: keep-alive
Cache-Control: max-age=0
Authorization: Digest username="maxi", realm="Login to FH0427PAZ00039", nonce="283823519", uri="/cgi-bin/snapshot.cgi?", response="0277c9531d9092d97fde2ac2d46cc854", qop=auth, nc=00000001, cnonce="2838235157899296"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8


HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 94712 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 4344 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 856 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 2896 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 1448 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 3161 
rs is 1 
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-type: image/jpeg
CONNECTION: close
CONTENT-LENGTH: 198510

����buflen is 0 
^C[gimbal_vsheen_http-2] killing on exit
[rosout-1] killing on exit
[master] killing on exit
shutting down processing monitor...
... shutting down processing monitor complete
done
maxi@maxi:~$ 

保存在SD卡上的抓图可以看到EXIF信息,但是http传回来的,然后自己上传到Git上的说没有EXIF信息。

可以用这个软件看

opanda iexif中文版下载-Exif信息查看器官方下载「图片工具」-华军软件园

 

用这个软件看EXIF信息也可以看到

Opanda PowerExif破解版V1.3 中文版

Opanda PowerExif破解版(图像Exif信息编辑程序)V1.3 中文版软件下载 - 绿色先锋下载 - 绿色软件下载站

这个网页也可以看得到GPS信息。

EXIF信息查看器

确实传回的图片的EXIF里面就没有GPS信息。

9.28晚上十点

我看了下通过URL浏览器方式获取的传回的抓图也是没有EXIF信息的!!!!所以不是我获取的问题,是传回来的本身就没有!!!!!

也就是今天上午我最开始用浏览器获取到的抓图。

 

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

http Digest认证计算方法整理 的相关文章

  • 如何将 POST 请求内容保存为 .NET 中的文件 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个客户端应用程序POST请求a
  • 有没有办法测量 Java (Servlet) I/O 流量?

    我尝试做的是使用以下代码实现 servlet 过滤器 int up request getContentLength if HttpServletRequest request getQueryString null up Math max
  • HTTP 重定向图像可以吗?

    返回图片资源时返回301 302 303代码可以吗 我过去曾这样做过 而且似乎有效 这是好的做法吗 它与大多数浏览器兼容吗 是的 您可以重定向图像 浏览器将遵循重定向 但出于性能原因 您通常希望将重定向保持在最低限度 因为每个重定向都需要单
  • 在Java中解析包含multipart/form-data请求体的字符串

    问题陈述 我认为标题说明了一切 我正在寻找解析 a 的方法String包含 multipart form data HTTP 请求的正文部分 IE 字符串的内容看起来像这样 xyzseparator blah Content Disposi
  • HTTP请求压缩

    一般用例 想象一下一个正在上传大量 JSON 的客户端 内容类型应保留application json因为这描述了实际数据 Accept Encoding 和 Transfer Encoding 似乎是为了告诉服务器应该如何格式化响应 看起
  • “双点”可以作为 URL 路径部分的一部分吗

    在 URL 中使用父目录双点是否有效且安全 如下例所示 http example com path to file jpg RFC3986 https www rfc editor org rfc rfc3986定义 URI 它描述了路径如
  • 在 Ubuntu 12.04 上的 Apache 上配置 SVN 服务器

    我正在尝试通过 HTTP 访问现有的 Subversion 服务器 我的dav svn conf文件看起来像
  • 如何使用独立的 Jetty 进行服务器推送

    我正在尝试使用独立的 Jetty 在静态网站上测试服务器推送功能 我的网站由一个index html 1个CSS 一堆图像组成 目录结构为 Album index html style css images image 1 png a se
  • 外部依赖错误的 HTTP 状态代码

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

    恶意用户是否可以将 SESSION 在 php 中 变量设置为他想要的任何值 很大程度上取决于您的代码 有一点非常明显 SESSION username REQUEST username
  • 当会话令牌无效时,我应该使用什么状态代码?

    创建 Web 服务 RESTful 时 当会话令牌无效时我应该使用什么状态代码 目前我公司的人给我发了一个404 未找到 但我认为这是不正确的 因为资源存在 也许我应该使用 401 Unauthorized 你怎么认为 您建议我在这种情况下
  • 从 HTTP 登录到 HTTPS

    我的网站默认使用 HTTP 我确实有一个启用 HTTPS 的证书 但只有其上的某些区域强制建立安全连接 登录是通过 Ajax 处理的 我想开始使用 SSL 即使请求来自 HTTP 我尝试强制请求的地址具有 HTTPS 并且它完美地回复 然而
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 使用 Anypoint Studio (MULE) 在本地主机上找不到资源

    我尝试按照 MuleSoft 网站上建议的教程进行操作 我首先从这个例子开始
  • 网站(Google 和/或您)应如何处理 Accept-Language 标头?

    很长一段时间以来 我对谷歌在以下情况下的行为并不满意 并且在无意中注意到之后80 其他人 https stackoverflow com questions 1011167 what are common ui misconceptions
  • Python Requests 库重定向新 url

    我一直在浏览 Python 请求文档 但看不到我想要实现的任何功能 在我的脚本中我设置allow redirects True 我想知道该页面是否已重定向到其他内容 新的 URL 是什么 例如 如果起始 URL 为 www google c
  • 在 HTML 表单中使用 PUT 方法

    我可以在 HTML 表单中使用 PUT 方法将数据从表单发送到服务器吗 根据HTML标准 https www w3 org TR html5 sec forms html element attrdef form method 你可以not
  • 明文 HTTP 流量...不允许

    我的程序从用户那里获取一个 URL 因此它可以向互联网上的任何网站发出请求 我试图让这成为可能 我查找了有关 Android HTTP Cleartext 错误的所有答案 并做了这个 但它仍然不允许我连接我的测试本地 PHP 服务器 我在这
  • 使用 POST 将数据从 Android 发送到 AppEngine Datastore

    抱歉 如果这是一个简单的问题 但我只是不知道我应该做什么 而且我认为我有点超出了我的深度 我想将数据从 Android 应用程序发送到在 Google App Engine 上运行的应用程序 数据必须从那里写入数据存储区 我的数据主要采用对
  • php 注意到 $GLOBALS['HTTP_SERVER_VARS']['HTTP_HOST'] 中未定义索引 http_host

    突然 在最近的 php 版本更新后 我从 php 收到了此通知 它在多个地方使用 特别是我的 htmlMimeMail 类 代码是 mail gt setSMTPParams mail xxxx xxx 26 GLOBALS HTTP SE

随机推荐

  • 这应该是postman最详细的中文使用教程了

    转载自 xff1a https www jianshu com p 77f4f9175028 这应该是postman最详细的中文使用教程了 xiaolanzi007 22017 03 17 17 38 40字数 2 419阅读 173 00
  • Postman安装与使用(转载)

    转载自 xff1a https www cnblogs com fnng p 9136434 html Postman安装与使用 2018 06 04 22 58 虫师 阅读 418868 评论 13 编辑 收藏 举报 Postman一款非
  • Python requests HTTP验证登录实现流程

    对我而言最重要的是这几句 假设url为http xxx yyy zzz 用户名为admin 密码为123456 则访问的网址应该为http admin 123456 64 xxx yyy zzz http username password
  • 记一次Ubuntu 18.04 内核升级(转载)

    https zhuanlan zhihu com p 75669680 记一次Ubuntu 18 04 内核升级 CCCCCaO 闷骚得很 前言 原本使用 Ubuntu Server 18 04 2 LTS 来搭建一个NextCloud服务
  • 有图形化工具升级linux内核 ukuu-gtk

    有图形化工具升级linux内核 ukuu gtk https zhuanlan zhihu com p 75669680 转载自 xff1a https os 51cto com art 201905 596204 htm 借助UKUU在U
  • 网络通信1—TCP程序编写步骤(参照 Ubuntu 16.04 版本)(转载)

    转载自 xff1a https blog csdn net wenfei11471 article details 79478105 网络通信1 TCP程序编写步骤 xff08 参照 Ubuntu 16 04 版本 xff09 wenfei
  • select实现简单TCP通信(ubuntu 18.04)

    用法 cilent IP地址 然后在终端输入内容敲回车就可以了 端口号在代码里写的 转载自 xff1a https www cnblogs com soldierback p 10701684 html select实现简单TCP通信 ub
  • C语言网络编程(2)— TCP通信(转载)

    转载自 xff1a C语言网络编程 xff08 2 xff09 TCP通信 Willliam william的博客 CSDN博客 c语言tcp网络编程 C语言网络编程 xff08 2 xff09 TCP通信 Willliam william
  • 在ubuntu+vs code上通过HTTP协议实现服务器端和客户端通信(转载)

    转载自 xff1a 在ubuntu 43 vs code上通过HTTP协议实现服务器端和客户端通信 DP323的博客 CSDN博客 在 ubuntu 43 vs code上通过HTTP协议实现服务器端和客户端通信 DP323 2021 06
  • 常见元件、封装及尺寸

    封装类型 贴片元器件封装形式是半导体器件的一种封装形式 表面贴片技术 xff08 SMT xff09 所涉及的零件种类繁多 xff0c 有许多已形成业界通用标准 xff0c 这主要是一些芯片电容电阻等 xff1b 有许多仍在不断的变化 xf
  • C++:C语言实现HTTP的GET和POST请求

    似乎写代码发HTTP请求需要自己把完整的协议帧写出来 xff1f 而不是单纯填个URL就行了 xff0c 那既然完整协议帧都写出来了 xff0c 那我直接TCP发不就可以了 xff1f 还是说不能这样 基本你百度搜 c 43 43 发送ht
  • 字符串连接函数strcat,这个可以好好用用

    字符串连接函数strcat xff0c 这个可以好好用用 C 43 43 xff1a C语言实现HTTP的GET和POST请求 方方和圆圆 博客园 C 43 43 编写的Linux下Http请求 c 43 43 httplinux 其它代码
  • HTTP 账号密码验证

    http请求带用户名和密码验证 wdk的博客 CSDN博客 url带用户名和密码 转载自 xff1a HTTP 账号密码验证 qq 25600055的专栏 CSDN博客 HTTP 账号 密码验证 173300598 2018 05 28 1
  • http authorization 基本认证

    转载自 xff1a http authorization 基本认证 szchenrong 博客园 http authorization 基本认证 http协议是无状态的 xff0c 浏览器和web服务器之间可以通过cookie来身份识别 桌
  • HTTP报文(这篇讲得比较详细)

    转载自 xff1a HTTP报文 逆心 博客园 之前写过一篇HTML报文 xff0c 但是感觉写完之后还是不懂 xff0c 最近终于有时间开始看 HTTP权威指南 xff0c 看完之后觉得还是比之前的理解更加深入了 xff0c 提取HTTP
  • libcurl可以发送http请求

    libcurl可以发送http请求 轻量级C 43 43 实现的httpserver和httpclient c 43 43 httpserver C 43 43 代码类资源 CSDN下载 转 libcurl库使用方法 xff0c 好长 xf
  • Http Get请求简单实例(C++)

    转载自 xff1a 掘金 https juejin cn post 6844903897161531400 Http Get请求简单实例 xff08 C 43 43 xff09 HTTP报文 HTTP请求报文 请求行 xff1a GET H
  • 纯C++实现的HTTP请求封装(POST/GET)

    转载自 xff1a 纯C 43 43 实现的HTTP请求封装 xff08 POST GET xff09 阳光柠檬 的技术笔记 CSDN博客 纯C 43 43 实现的HTTP请求封装 xff08 POST GET xff09 时间 2016
  • [转]www-authenticate认证过程浅析

    转载自 xff1a 转 www authenticate认证过程浅析 maoliran的博客 CSDN博客 转 www authenticate认证过程浅析 新一下的兰天 2016 07 06 18 22 20 18002 正在上传 重新上
  • http Digest认证计算方法整理

    摘要认证及实现HTTP digest authentication 简书 HTTP Basic和Digest认证介绍与计算 诸子流 博客园 不要不知道上面说的URI是什么意思啊 图解HTTP 第 8 章 确认访问用户身份的认证 简书 8 1