關於SIP中的Authorization

來源:互聯網
上載者:User

  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值,如下:

void DigestCalcResponse(
 IN HASHHEX HA1, /* H(A1) */
 IN char * pszNonce, /* nonce from server */
 IN char * pszNonceCount, /* 8 hex digits */
 IN char * pszCNonce, /* client nonce */
 IN char * pszQop, /* qop-value: "", "auth", "auth-int" */
 IN char * pszMethod, /* method from the request */
 IN char * pszDigestUri, /* requested URL */
 IN HASHHEX HEntity, /* H(entity body) if qop="auth-int" */
 OUT HASHHEX Response /* request-digest or response-digest */
 )
{
 MD5_CTX Md5Ctx;
 HASH HA2;
 HASH RespHash;
 HASHHEX HA2Hex;
 
 // calculate H(A2)
 MD5Init(&Md5Ctx);
 MD5Update(&Md5Ctx, pszMethod, strlen(pszMethod));
 MD5Update(&Md5Ctx, ":", 1);
 MD5Update(&Md5Ctx, pszDigestUri, strlen(pszDigestUri));
 if (stricmp(pszQop, "auth-int") == 0) {
  MD5Update(&Md5Ctx, ":", 1);
  MD5Update(&Md5Ctx, HEntity, HASHHEXLEN);
 };
 MD5Final(HA2, &Md5Ctx);
 CvtHex(HA2, HA2Hex);
 
 // calculate response
 MD5Init(&Md5Ctx);
 MD5Update(&Md5Ctx, HA1, HASHHEXLEN);
 MD5Update(&Md5Ctx, ":", 1);
 MD5Update(&Md5Ctx, pszNonce, strlen(pszNonce));
 MD5Update(&Md5Ctx, ":", 1);
 
 if (*pszQop) {
  MD5Update(&Md5Ctx, pszNonceCount, strlen(pszNonceCount));
  MD5Update(&Md5Ctx, ":", 1);
  MD5Update(&Md5Ctx, pszCNonce, strlen(pszCNonce));
  MD5Update(&Md5Ctx, ":", 1);
  MD5Update(&Md5Ctx, pszQop, strlen(pszQop));
  MD5Update(&Md5Ctx, ":", 1);
 };
 
 MD5Update(&Md5Ctx, HA2Hex, HASHHEXLEN);
 MD5Final(RespHash, &Md5Ctx);
 CvtHex(RespHash, Response);
};

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.