场景 在安迅士摄像机网页上,配置系统选项,HTTP/RTSP Password Settings 中, 选择Encrypted only。获取设备的云台状态信息,使用的是摘要认证 例子 void CAnXunShiConn::TestlibCurlHTTPDegistAuth() { CURL *pCurlHandle = curl_easy_init(); curl_easy_setopt(pCurlHandle, CURLOPT_CUSTOMREQUEST, "GET"); curl_easy_setopt(pCurlHandle, CURLOPT_URL, "http://192.168.18.84/axis-cgi/com/ptz.cgi?camera=1&query=position"); curl_easy_setopt(pCurlHandle, CURLOPT_USERPWD, "root:admin12345"); curl_easy_setopt(pCurlHandle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); curl_easy_setopt(pCurlHandle, CURLOPT_WRITEFUNCTION, WriteResponseBody);//设置回调函数 //curl_easy_setopt(pCurlHandle, CURLOPT_HEADER, 1);//保存HTTP头部信息到strResponseData curl_easy_setopt(pCurlHandle, CURLOPT_WRITEDATA, &strResponseData);//设置回调函数的参数,获取反馈信息 curl_easy_setopt(pCurlHandle, CURLOPT_TIMEOUT, 15);//接收数据时超时设置,如果10秒内数据未接收完,直接退出 curl_easy_setopt(pCurlHandle, CURLOPT_MAXREDIRS, 1);//查找次数,防止查找太深 curl_easy_setopt(pCurlHandle, CURLOPT_CONNECTTIMEOUT, 5);//连接超时,这个数值如果设置太短可能导致数据请求不到就断开了 CURLcode nRet = curl_easy_perform(pCurlHandle); if (0 == nRet) { std::cout << strResponseData << std::endl; } curl_easy_cleanup(pCurlHandle); } 基础知识 ◆ 摘要认证 digest authentication ← HTTP1.1提出的基本认证的替代方法 服务器端以nonce进行质询,客户端以用户名,密码,nonce,HTTP方法,请求的URI等信息为基础产生的response信息进行认证的方式。 ※ 不包含密码的明文传递 摘要认证步骤: 1. 客户端访问一个受http摘要认证保护的资源。 2. 服务器返回401状态以及nonce等信息,要求客户端进行认证。 HTTP/1.1 401 Unauthorized WWW-Authenticate: Digest realm="[email protected]", qop="auth,auth-int", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41" 3. 客户端将以用户名,密码,nonce值,HTTP方法, 和被请求的URI为校验值基础而加密(默认为MD5算法)的摘要信息返回给服务器。 认证必须的五个情报: ・ realm : 响应中包含信息 ・ nonce : 响应中包含信息 ・ username : 用户名 ・ digest-uri : 请求的URI ・ response : 以上面四个信息加上密码信息,使用MD5算法得出的字符串。 Authorization: Digest username="Mufasa", ← 客户端已知信息 realm="[email protected]", ← 服务器端质询响应信息 nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", ← 服务器端质询响应信息 uri="/dir/index.html", ← 客户端已知信息 qop=auth, ← 服务器端质询响应信息 nc=00000001, ← 客户端计算出的信息 cnonce="0a4f113b", ← 客户端计算出的客户端nonce response="6629fae49393a05397450978507c4ef1", ← 最终的摘要信息 ha3 opaque="5ccc069c403ebaf9f0171e9517f40e41" ← 服务器端质询响应信息 4. 如果认证成功,则返回相应的资源。如果认证失败,则仍返回401状态,要求重新进行认证。 特记事项: 1. 避免将密码作为明文在网络上传递,相对提高了HTTP认证的安全性。 2. 当用户为某个realm首次设置密码时,服务器保存的是以用户名,realm,密码为基础计算出的哈希值(ha1),而非密码本身。 3. 如果qop=auth-int,在计算ha2时,除了包括HTTP方法,URI路径外,还包括请求实体主体,从而防止PUT和POST请求表示被人篡改。 4. 但是因为nonce本身可以被用来进行摘要认证,所以也无法确保认证后传递过来的数据的安全性。 ※ nonce:随机字符串,每次返回401响应的时候都会返回一个不同的nonce。 ※ nounce:随机字符串,每个请求都得到一个不同的nounce。 ※ MD5(Message Digest algorithm 5,信息摘要算法) ① 用户名:realm:密码 ⇒ ha1 ② HTTP方法:URI ⇒ ha2 ③ ha1:nonce:nc:cnonce:qop:ha2 ⇒ ha3 WSSE(WS-Security)认证 ← 扩展HTTP认证 WSSE UsernameToken 服务器端以nonce进行质询,客户端以用户名,密码,nonce,HTTP方法,请求的URI等信息为基础产生的response信息进行认证的方式。 ※ 不包含密码的明文传递 WSSE认证步骤: 1. 客户端访问一个受WSSE认证保护的资源。 2. 服务器返回401状态,要求客户端进行认证。 HTTP/1.1 401 Unauthorized WWW-Authenticate: WSSE realm="[email protected]", profile="UsernameToken" ← 服务器期望你用UsernameToken规则生成回应 ※ UsernameToken规则:客户端生成一个nonce,然后根据该nonce,密码和当前日时来算出哈希值。 3. 客户端将生成一个nonce值,并以该nonce值,密码,当前日时为基础,算出哈希值返回给服务器。 Authorization: WSSE profile="UsernameToken" X-WSSE:UsernameToken username="Mufasa", PasswordDigest="Z2Y......", Nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", Created="2010-01-01T09:00:00Z" 4. 如果认证成功,则返回相应的资源。如果认证失败,则仍返回401状态,要求重新进行认证。 特记事项: 1. 避免将密码作为明文在网络上传递。 2. 不需要在服务器端作设置。 3. 服务器端必须保存密码本身,否则无法进行身份验证。
来源:https://blog.csdn.net/bingzhang8449/article/details/100964551
标签:setopt,libcurl,摘要,第五课,Authentication,easy,pCurlHandle,curl,CURLOPT From: https://www.cnblogs.com/ywtssydm/p/17025952.html