织梦CMS - 轻松建站从此开始!

罗索

关于SIP中的Authorization

jackyhwei 发布于 2010-06-29 18:09 点击:次 
RFC2617定义了两种加密的方式,一种是BASE64的,另一种是MD5加密,大多SIP协议栈都采用的后者,可能是出于安全的考虑,因为MD5是不可逆的。落鹤生:其实SIP中的认证跟HTTP、RTSP等的认证是一模一样的,没任何区别。
TAG:

落鹤生:其实SIP中的认证跟HTTP、RTSP等的认证是一模一样的,没任何区别。

SIP Client起来后第一件事应该是到服务器去注册,这样当有电话呼叫时服务器才能正确的定位 ,注册设计到一个认证的过程。

RFC2617定义了两种加密的方式,一种是BASE64的,另一种是MD5加密,大多SIP协议栈都采用的后者,可能是出于安全的考虑,因为MD5是不可逆的。

对于MD5的方式,RFC2617有提供一个example的实现,有源代码,但奇怪的是我将它的源代码复制下来,运行后发现,计算RFC2617中的例子时得到的MD5值是对的,但我自己架的3CX Server和PBX却总是work不起来,我用x-lite去注册,然后抓包比对发现原因是我计算出来到MD5值Response不对,这让我很是郁闷,后来比对发现两者之间有些差别,例子中有Cnonce值,但我抓的包中没有,于是我将Cnonce置为NULL计算,发现还是不对,没辙了,只好去研究它们的计算方法。

后来发现SIP中验证的MD5值是通过如下方式得到的:

   step1:caculate username:realm:password MD5 value to get HA1

   step2:caculate method:uri MD5 value to get HA2

   step3:caculate HA1:nonce:HA2 MD5 value, it's the result

对比源代码,我注掉一段code后,发现得到了正确的MD5值,如下:

  1. void DigestCalcResponse( 
  2.  IN HASHHEX HA1, /* H(A1) */ 
  3.  IN char * pszNonce, /* nonce from server */ 
  4.  IN char * pszNonceCount, /* 8 hex digits */ 
  5.  IN char * pszCNonce, /* client nonce */ 
  6.  IN char * pszQop, /* qop-value: "", "auth", "auth-int" */ 
  7.  IN char * pszMethod, /* method from the request */ 
  8.  IN char * pszDigestUri, /* requested URL */ 
  9.  IN HASHHEX HEntity, /* H(entity body) if qop="auth-int" */ 
  10.  OUT HASHHEX Response /* request-digest or response-digest */ 
  11.  ) 
  12.  MD5_CTX Md5Ctx; 
  13.  HASH HA2; 
  14.  HASH RespHash; 
  15.  HASHHEX HA2Hex; 
  16.   
  17.  // calculate H(A2) 
  18.  MD5Init(&Md5Ctx); 
  19.  MD5Update(&Md5Ctx, pszMethod, strlen(pszMethod)); 
  20.  MD5Update(&Md5Ctx, ":", 1); 
  21.  MD5Update(&Md5Ctx, pszDigestUri, strlen(pszDigestUri)); 
  22.  if (stricmp(pszQop, "auth-int") == 0) { 
  23.   MD5Update(&Md5Ctx, ":", 1); 
  24.   MD5Update(&Md5Ctx, HEntity, HASHHEXLEN); 
  25.  }; 
  26.  MD5Final(HA2, &Md5Ctx); 
  27.  CvtHex(HA2, HA2Hex); 
  28.   
  29.  // calculate response 
  30.  MD5Init(&Md5Ctx); 
  31.  MD5Update(&Md5Ctx, HA1, HASHHEXLEN); 
  32.  MD5Update(&Md5Ctx, ":", 1); 
  33.  MD5Update(&Md5Ctx, pszNonce, strlen(pszNonce)); 
  34.  MD5Update(&Md5Ctx, ":", 1); 
  35.   
  36.  if (*pszQop) { 
  37.   MD5Update(&Md5Ctx, pszNonceCount, strlen(pszNonceCount)); 
  38.   MD5Update(&Md5Ctx, ":", 1); 
  39.   MD5Update(&Md5Ctx, pszCNonce, strlen(pszCNonce)); 
  40.   MD5Update(&Md5Ctx, ":", 1); 
  41.   MD5Update(&Md5Ctx, pszQop, strlen(pszQop)); 
  42.   MD5Update(&Md5Ctx, ":", 1); 
  43.  }; 
  44.   
  45.  MD5Update(&Md5Ctx, HA2Hex, HASHHEXLEN); 
  46.  MD5Final(RespHash, &Md5Ctx); 
  47.  CvtHex(RespHash, Response); 
  48. }; 

 

(leesphone)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201006/9751.html]
本文出处:CSDN博客 作者:leesphone
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容