sip註冊時有四個步驟,
1.客戶端向服務端發送不帶Authorization字段的註冊請求
2.服務端回401,在回覆消息頭中帶WWW_Authorization
3.客戶端向服務端發送帶Authorization字段註冊請求,Authorization字段中的response信息是
根據收到的WWW_Authorization中的信息和本地的一個密碼信息計算出來的。
4.服務端會自己計算一個Response值,和客戶端發來的對比,一樣的會回客戶端一個200OK,表示
註冊成功。比對不一樣回其他錯誤碼給客戶端。
Sip invite時(freeswitch)使用時也需要進行md5校驗;
response的計算方法:
1)HASH1=MD5( username:realm:passwd)
2)HASH2=MD5(method:uri)
3)response=MD5(HA1:nonce:HA2)
exosip/osip是通過下面的兩個函數計算response,該exosip/osip的版本是2-4.1.0。
char HA1[265],HA2[265];
DigestCalcHA1(0, pszUser, realm_.c_str(), passwd, 0, 0, HA1);
該函數通過pszUser,realm, passwd三個值產生HA1
pszUser, realm是客戶端發送過來的。passwd是服務端本地的,其值事先和客戶端定好的,客戶端的發來的response值也要通過他自己本地
的pwd來計算。
DigestCalcResponse(HA1, pszNonceFromHeader,pszNonceCount, pszCNonce, pszopo, 1, pszMethod, pszUri, HA2, Response);
先通過method:uri產生HA2
如果參數pszopo是空,通過HA1:nonce:HA2產生Response
計算字符串md5方法:
echo -n “hello world”|md5sum