建設(shè)網(wǎng)站深圳全媒體運(yùn)營師報(bào)名入口
最近工作中遇到需要對接1400協(xié)議,網(wǎng)上搜索不到c/c++的實(shí)現(xiàn),所以記錄一下自己的實(shí)現(xiàn)。
第一步注冊:
1400是在http摘要認(rèn)證的基礎(chǔ)上做的,所以要去了解http摘要認(rèn)證的流程
說明:
1.視圖庫通過用戶分配,手動(dòng)分配username,password給三方對接程序
2.三方對接程序第一次請求由于不知道Authorization請求頭填寫信息,所以視圖庫接收到未帶Authorization請
求頭信息的請求時(shí)會(huì)相應(yīng)401,并附帶請求頭WWW-Authenticate請求頭信息
3.三方根據(jù)視圖庫響應(yīng)的WWW-Authenticate信息進(jìn)行RFC2617 digest(下文)加密生成秘鑰放入請求頭Authorization中,重新發(fā)送請求
4.視圖庫解析Authorization請求頭中的秘鑰,將解析出的用戶名和密碼進(jìn)行匹配,匹配成功,則注冊成功,否
則注冊失敗
參數(shù)說明:
username是要認(rèn)證的用戶名
WWW-Authenticate是httpd的一個(gè)標(biāo)頭
realm的值是一個(gè)簡單的字符串
qop是認(rèn)證的(校驗(yàn))方式,這個(gè)比較重要,對后面md5的加密過程有影響,值就按照上面的那樣寫就行了
nonce的值也是一個(gè)字符串,如果不嚴(yán)格,可以隨機(jī)生成一個(gè)就行,注意它是個(gè)GUID,即唯一的、不重復(fù)的。如果嚴(yán)格,則需要包含時(shí)間信息、客戶端IP信息和其它信息,因?yàn)檎J(rèn)證過程的時(shí)間很短,所以如果服務(wù)器收到認(rèn)證信息后發(fā)現(xiàn)這個(gè)時(shí)間和服務(wù)器的時(shí)間相去甚遠(yuǎn),那說明不正常,直接拒絕,以防止攻擊,還有客戶端IP,如果這個(gè)IP一直這樣攻擊,則可以在一定時(shí)間內(nèi)發(fā)現(xiàn)是該IP的連接則直接斷掉。這些嚴(yán)格的做法主要是為了防止攻擊。在rfc2617上有狹路為詳細(xì)的描述。我這里沒有考慮這些,只是使用了個(gè)簡單的字符串
url是本次請求的資源位置,比如“/public/userinfo.htm”
cnonce是客戶端產(chǎn)生的一個(gè)GUID,一般是32字節(jié),而且是16個(gè)字節(jié)字符串的16進(jìn)制形式表示,所以其中的內(nèi)容是0~9和a~f之間的那些字符。其實(shí)nonce也是一樣,但我沒有特意這樣做,比如我直接生成一個(gè)數(shù)字,然后以16進(jìn)制輸出,而沒有特殊追求16個(gè)字節(jié)。
nc是認(rèn)證的次數(shù),因?yàn)槿绻J(rèn)證失敗,則仍然可以重新發(fā)送認(rèn)證信息繼續(xù)認(rèn)證,第一次是1,第二次是2,第三次是3,...。但我這里沒有這樣弄,只允許一次,如果認(rèn)證不過就關(guān)閉了連接,所以我只處理了1的情況,即00000001,這個(gè)值總是固定的8個(gè)字節(jié),而且不加引號,和其它域的格式不一樣
response的值就很重要了,是根據(jù)以上信息,再加上密碼通過一定的順序計(jì)算出的一個(gè)md5碼,固定為16字節(jié)的16進(jìn)制表示形式。服務(wù)器在收到所有這些信息后,也通過相同的方式計(jì)算出這個(gè)值,而密碼則是保存在服務(wù)器端,即服務(wù)器要通過用戶名去找到對應(yīng)的密碼,然后和計(jì)算出md5值,再和客戶端傳過來的response值對比,如果一樣,則認(rèn)證通過,否則通不過。
RFC2617 digest加密:
MD5((MD5)HA1:HD:(MD5)HA2)
如果algorithm的值是“md5-sess”,則
HA1=username:realm:password:nonce:cnonce
否則
HA1=username:realm:password
HD=nonce:noncecount:cnonce:qop
HA2=method:uri
method是指“GET”/"POST",即http頭中指定的獲取資源的方式
以下是c/c++代碼
#ifndef __CAT1400_H
#define __CAT1400_H
#include "CCurlManager.h"
#include "CTgSSL.h"
#define CAT1400IP "*******"
#define CAT1400PORT ****
#define CATDE