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