sip注册时有四个步骤,
1.客户端向服务端发送不带Authorization字段的注册请求
2.服务端回401,在回复消息头中带WWW_Authorization
3.客户端向服务端发送带Authorization字段注册请求,Authorization字段中的response信息是
根据收到的WWW_Authorization中的信息和本地的一个密码信息计算出来的。
4.服务端会自己计算一个Response值,和客户端发来的对比,一样的会回客户端一个200OK,表示
注册成功。比对不一样回其他错误码给客户端。
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
参考:GB/T28181-2011 《安全防范视频监控联网系统信息传输、交换、控制技术要求》
http://blog.chinaunix.net/uid-26212859-id-3485297.html