`

理解SIP的认证

    博客分类:
  • sip
 
阅读更多

转的,原作的图片就没有,不过别的有用!

 

1. 认证和加密
    认证(Authorization)的作用在于表明自己是谁,即向别人证明自己是谁。而相关的概念是MD5,用于认证安全。注意MD5仅仅是个hash函数而已,并不是用于加密。因为hash函数处理后的数据没法进行反向恢复,这样子的话别人没法盗取你认证身份的口令。
    加密(Encryption)的作用在于对想传输的数据进行处理,在网络中即使被窃取也难以破解。加密的信息可以被破解,这需要一把钥匙——“密钥”。通过密钥,我们可以对数据进行加密和解密。最有名的专用密钥加密系统就是数据加密标准(DES), 这个标准现在由美国国家安全局和国家标准与技术局来管理。另一个系统是国际数据加密算法(IDEA), 它比DES的加密性好, 而且需要的计算机功能也不怎么强。
2. SIP认证方式
    SIP的认证是继承了HTTP的认证方式。根据RFC2617,HTTP的认证方案主要有Basic Authentication Scheme和Digest Access Authentication Scheme两种。而Basic方法使用的口令原文验证的方式,易被盗取,所以SIP已经摒弃这种方式。
    Digest认证方案可以对口令进行MD5包装。一般来说,获取口令有两种方式:1.字典攻击,即使用轮询进行口令猜测的方法,如果口令简单比较危险;另一个方法是攻击服务器来获得口令,如果服务器把密码存储起来那样的话就可能被盗取。所以方法是服务器端不再存储密码原文,而是使用MD5包装起来,这样的话当经过MD5包装的认证信息过来后,比较存储的MD5数据则可知道用户的身份了。
3. SIP认证过程
UA之间的认证

理解SIP的认证

 

图1-1 UA之间的认证流程


UA和Proxy之间的认证

理解SIP的认证

 

图1-2 UA和Proxy之间的认证流程


     从以上两图看出,首先当UAC给UAS/Proxy发请求时;如果UAS/Proxy需要认证信息,则回复401/407;这时UAC通过回复信息来计算认证消息,然后重新发送 请求;如果认证不通过的话则会继续收到401/407或403,这时UAC必须不能再次使用刚才被拒绝的信任书进行尝试,需要重新生成请求直至UA/Proxy认证通过。注意也可以第一次请求时就已经带有认证信息。
    当UAC在接收到401(Unauthorized)或者407(ProxyAuthenticationRequired)应答之后,重新用它的信任书来提交请求,它必须增加Cseq头域的值,就像发送一个正常的新请求一样。
    如果认证通过的话,UA应当把这个给特定To头域和”realm”字段的信任书cache起来,以备给这个地址下一个请求时候使用。
    我们建议使用下列步骤来cache一个proxy的信任书:如果UA在给特定Call-ID的请求的401/407应答中,接收到一个Proxy-Authenticate头域,它应当合并对这个realm的信任书,并且为以后具有相同Call-ID的请求发送这个信任书。这些信任书必须在对话中被cache住;不过如果UA配置的是它自己的本地外发proxy,那么如果出现要求认证的情况,那么UA应当cache住跨对话的信任书。注意,这个意味着在一个对话中的请求可以包含在Route头域中所经过proxy都不需要的信任书。
    当服务器可以正确处理绝大部分SIP请求,有本文档约定了两类请求要求特别的认证处理:ACK和CANCEL。在某一个认证方案下,并且这个认证方案是使用应答来放置计算nonces(比如Digest),那么对于某些没有应答的情况,就会出现问题,比如ACK。所以,基于这个原因,一个服务器接受在INVITE请求中的信任书,也必须同样接收对应ACK的信任书。UAC通过赋值所有的INVITE请求中的Authorization和Proxy-Authorization头域值来创建一个相关的ACK消息。服务器必须接收这个ACK请求。
    虽然CANCEL方法具有应答(2xx),服务器必须不能拒绝CANCEL请求,因为这些请求不能被重新提交。通常,如果CANCEL请求和被CANCEL的请求来自同一个节点(假设某种通讯协议,或者网络层有安全关系26.2.1节描述),服务器应当接收CANCEL请求。
     可见SIP为认证系统提供了一个无状态的,试错机制,这个认证机制式基于HTTP的认证机制的。通过请求和回复来验证用户身份。
4. 认证消息解析
注:只讲述重要字段,细节查看RFC2617。
具体为401中的WWW-Authenticate应答头域,相对应的为请求的Authorization头域;407中的Proxy-Authenticate头域,相对应的是请求的Proxy-Authorization头域。
a) WWW-Authenticate/Proxy-Authenticate头域
这个头域值包含了至少一个表明认证方式和适用realm的参数的拒绝原因。
如:
      WWW-Authenticate: Digest
              realm="biloxi.com",
              qop="auth,auth-int",
              nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
          opaque="5ccc069c403ebaf9f0171e9517f40e41"
i. Realm
realm字串单独定义被保护的区域。Realm字串必须是全局唯一的。我们强调这个realm字串必须包含一个主机名或者域名。Realm字串应当是一个可读的能够展示给用户的字串。
通常,SIP认证对于特定realm(一个保护区域)是有意义的。因此,对于Digest认证来说,每一个类似的保护区域都有自己的用户名和密码集合。
ii. Nonce
服务器端指定的数据字符,它应在每个401回应产生时,被唯一地创建。建议该字符以base64方式或16进制方式出现。另外,该字符在标题行中传递时是在引号内的,因此允许使用双引号字符。
iii. Stale
  一个标志,用来指示客户端先前的请求因其nonce值过期而被拒绝。如果stale是TRUE(大小写敏感),客户端可能希望用新的加密回应重新进行请求,而不用麻烦用户提供新的用户名和口令。服务器端只有在收到的请求nonce值不合法,而该nonce对应的摘要(digest)是合法的情况下(即客户端知道正确的用户名/口令),才能将stale置成TRUE值。如果stale是FALSE或其它非TRUE值,或者其stale域不存在,说明用户名、口令非法,要求输入新的值。
iv. Algorithm
Algorithm是个字符串,用来指示用来产生摘要及校验和的算法对。如果该域没指定,则认为是“MD5“算法。如果该域指定的算法无法理解,该质询(challenge)将被忽略。
v. qop
“auth”表示鉴别方式;“auth-int”表示鉴别保护的完整性。
vi. opaque
由服务器指定的字符串,客户端不能改动它,如果并发请求的URI也指向同一个受保护区间,则该信息将被加在这些请求的授权标题域中返给服务器。建议采用base64或16进制的字符串。
b) Authorization/Proxy-Authorization头域
该头域包含了具有这个UA到请求的资源所在的realm(区域)的信任书和所需要的认证支持的参数和重现保护的参数。
例子:
      Authorization: Digest username="bob",
              realm="biloxi.com",
              nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
              uri="sip:bob@biloxi.com",
              qop=auth,
              nc=00000001,
              cnonce="0a4f113b",
              response="6629fae49393a05397450978507c4ef1",
          opaque="5ccc069c403ebaf9f0171e9517f40e41"
如果服务器对特定请求没有要求认证或对于特定realm没有对应的认证信息,那么使用缺省的用户名,”anonymous”,并且这个用户名没有密码(密码是””)。
根据RFC2617,合法的回应包含对用户名、口令、给定nonce值、SIP方法、请求URI的校验和(checksum,缺省是MD5的校验和)。
i. Response
是个字符串,由32个经过计算的16进制数字组成,用来证明用户是否知道口令。
ii. Cnonce
当qop指示发送了,该指示必须要指定,而当服务器端没有在WWW-鉴别(WWW- Authenticate)标题域中添加qop指示时,该指示一定不能指定。cnonce-value是客户端提供的字符串,它由客户端和服务器共同使用,用来避免选择纯文本攻击、提供共同鉴别、提供某些消息的完整性保护。
5. 摘要的计算方法
128位的MD5摘要由32个可打印的ASCII码字符表示。128位摘要中的位按其重要性由高到低转换,在某个时刻每4位可用下面的ASCII表示。每4位都可用16进制字符‘0123456789abcdef’表示,也就是说,二进制0000由字符‘0’表示;0001由字符‘1’表示,以后如此类推,1111用‘f’表示。
在本文中,用KD(secret,data)来表示摘要算法,其中data指数据,secret表示采用的方法.如果表示校验和算法时,data要写成H(data);而unq(X)表示将带引号字符串的引号去掉。
简单来说,response =
H(H(username:realm:password):nonce:cnonce:H(requestMothod:request-URI))
以下为详细的计算规则.
对于"MD5" 和"MD5-sess" 算法:
H():hash函数
H(data) = MD5(data)

KD(secret, data) = H(concat(secret, ":", data))
也就是说,摘要(digest)就是对secret与data通过冒号连接一起的结果进行MD5运算。而"MD5-sess"算法则允许其它第三方服务器参与鉴别。
a) 请求-摘要(Request-Digest)
   如果”qop”值是"auth" 或"auth-int":
  request-digest = <"> < KD ( H(A1), unq(nonce-value)
   ":" nc-value
   ":" unq(cnonce-value)
   ":" unq(qop-value)
   ":" H(A2)
   ) <">
   如果”qop”指示没有给出(与RFC2069保持兼容性):
  request-digest =<"> < KD ( H(A1), unq(nonce-value)
  ":" H(A2)
  ) <">
   A1及A2的定义在下面。
b) A1
   如果算法("algorithm")值是”MD5”或没有指定,则A1是:
  A1 = unq(username-value) ":" unq(realm-value) ":" passwd
  其中
  passwd = < user's password >
  如果"algorithm"值是"MD5-sess",则A1只要计算一次,即当客户端发出第一个请求,并从服务器收到WWW-鉴别(WWW-Authenticate)质询(challenge)时计算。它使用该质询中的服务器的nonce,则用来构建A1的第一个客户端nonce值应为:
  A1 = H( unq(username-value) ":" unq(realm-value)
   ":" passwd )
   ":" unq(nonce-value) ":" unq(cnonce-value)
   上式为并发请求和回应的鉴别产生一个‘会话密钥’(session key),该密钥对于每个‘鉴别会话’(authentication session)都是不同的,这样,就限制了使用任何一个密钥进行哈希处理的次数。
c) A2
如果”qop”值是”auth”或者没给出,则A2:
A2 = Method ":" digest-uri-value 
如果"qop"值是"auth-int", 则A2:
A2 = Method ":" digest-uri-value ":" H(entity-body)
d) 指示值和带引号的字符串(Directive values and quoted-string)
注意,许多指示的取值,如”username-value”等,被定义成带引号的字符串(quoted-string)。而实际上,”unq”注释则表示在生成字符串A1时,去掉其外部的引号。因而,如当授权标题包括该域,如:
  username="Mufasa", realm=myhost@testrealm.com
则表示用户Mufasa的口令是"Circle Of Life",这样H(A1)就可表示成
  H(Mufasa:myhost@testrealm.com:Circle Of Life),注意,在摘要字符串中没有引号。
  注意,在摘要函数H()中的字符串中不允许出现空格,除非空格出现在带引号的字符串内或者用以标记字符串摘要的实体主体中。例如,上面出现的字符串A1必须是
  Mufasa:myhost@testrealm.com:Circle Of Life
在冒号的两边都不可以有空格,但是允许口令单词之间出现空格(Circle+SP+Of+SP+Life)。同样,其它由H()摘要的字符串也不能在用于域间分隔的冒号两边加空格,除非空格在引号内或被摘要的实体主体内。
   同样要注意的是,如果应用了完整性保护(integrity protection),即qop=auth-int,则H(实体-主体)就是实体主体的哈希值,而不是消息主体的哈希值,该值在发送方进行任何传输编码前计算,之后,被接收方删除。

做一件有意义的事是很容易的事,困难的是一直坚持做,坚持那颗用不服输的心,坚持学习,坚持。。。

分享到:
评论

相关推荐

    sip认证机制简介 Word文档

    SIP (Session Initiation Protocol) 是一种用于控制多媒体通信会话(如语音和视频通话)的信令协议。在 SIP 中,认证机制是确保只有授权的用户能够进行通信的...理解并正确实现这些机制对于构建安全的SIP网络至关重要。

    C#的SIP协议栈

    首先,我们需要理解SIP协议的基本原理。SIP是一种基于文本的协议,采用客户端-服务器模型,通过UDP或TCP等传输层协议进行通信。SIP消息包括请求消息(如INVITE、ACK、BYE等)和响应消息(如200 OK、486 Busy Here等...

    基于JAIN SIP的sip实现技术

    ### 基于JAIN SIP的SIP实现技术 #### 1. 引言 当前,在构建电话网络的过程中,存在两大主流信令体系:H.323...对于希望在现代通信领域开发创新解决方案的技术人员而言,深入理解SIP协议及JAIN SIP API是至关重要的。

    一个简单的JAVA-JAIN-SIP客户端,可以连接SIP服务端发起呼叫

    首先,我们要理解JAIN SIP(Java API for Internet Multimedia Subsystems)是Java ME和Java SE平台上的API,它提供了一组接口和类,使得开发者能够轻松地创建和管理SIP会话。JAIN SIP遵循JSR 116规范,是开发SIP...

    SIP测试软件

    通过使用Java版SIP软电话,学习者可以深入理解SIP协议的工作流程,包括消息交互、会话建立和管理,同时也可以实践Java编程技术,提升对网络通信协议的理解和应用能力。在实际使用中,可以对sip_test文件进行解压,...

    sip协议中文版.pdf_sip协议中文_

    **SIP协议中文版——深入理解Session Initiation Protocol** SIP(Session Initiation Protocol)是一种应用层控制协议,主要用于...理解SIP协议的工作原理及其组件,对于开发和维护高效、安全的通信系统至关重要。

    Sip注册 Java实现

    总的来说,Java中的SIP注册实现涉及到对SIP协议的深入理解,以及对JSR 289规范的熟练应用。通过分析和学习提供的代码示例,开发者可以更好地掌握SIP通信的基础,并进一步扩展到更复杂的SIP应用,如通话、消息传递等...

    Android官方提供的SipDemo

    这一步通常涉及用户交互,以获取正确的SIP地址和认证信息。 4. **注册与注销** - **注册**:使用SipManager的`register()`方法将设备注册到SIP服务器,以便接收呼叫和发送呼叫请求。 - **注销**:当不再需要使用...

    C++实现SIP协议栈

    7. **安全性**:SIP协议支持TLS加密和认证机制,如Digest认证。在C++实现中,需要集成OpenSSL库来处理安全连接和验证。 8. **错误处理与调试**:完善的错误处理机制是任何协议栈的关键部分,包括异常处理、日志记录...

    sip协议以及其编码标准

    **SIP协议详解** SIP(Session Initiation Protocol)是一种应用层控制协议,主要用于创建、修改和终止多媒体通信会话,如...通过理解并掌握SIP协议,开发者和网络管理员能够更好地设计和维护高效的多媒体通信服务。

    SIP.rar_sip_sip 实例_sip协议

    SIP(Session Initiation Protocol)协议是一种用于控制多媒体通信会话的信令协议,广泛应用...总的来说,这个压缩包是一个全面学习和理解SIP协议的好资源,无论是对初学者还是对已有经验的IT从业者来说都非常有价值。

    sip ua服务端demo

    1. **学习SIP协议**: 通过阅读和分析代码,开发者可以深入理解SIP的工作原理。 2. **快速集成**: 开发者可以在自己的项目中借鉴或直接使用此示例,快速实现SIP服务器功能。 3. **调试与测试**: 作为测试工具,帮助...

    miniSipServer + peers 实面的SIP实例(含源码)

    这个实例包括了miniSipServer的使用以及peers的配置,提供了源码分析的机会,有助于深入理解SIP的工作原理和实际应用。 首先,我们需要了解SIP的基本概念。SIP由IETF定义,主要由用户代理(UA)、代理服务器、...

    JAIN SIP 帮助文档

    通过阅读这份JAIN SIP帮助文档,开发者不仅可以深入理解SIP协议的工作原理,还能熟练掌握使用JAIN SIP库进行开发的方法,从而在构建实时通信应用时更加得心应手。文档中的“docs”文件很可能包含了所有这些内容,是...

    sip协议sip协议分析

    ### SIP协议分析与基础知识 #### 一、SIP协议简介 SIP (Session Initiation Protocol) 协议是一种用于创建、修改和终止多媒体...通过对这些核心概念的理解,可以更好地掌握SIP协议的工作原理及其在网络通信中的应用。

    sip2java-master.zip

    通过深入理解SIP2协议和提供的Java调用工具,开发者可以轻松地将图书馆系统接入到各种自助服务设备中,提供便捷的图书服务,提升用户体验。同时,这也为图书馆系统的扩展和升级提供了强大的支持。

    3GPP SIP协议介绍

    **3GPP SIP协议介绍** SIP(Session Initiation Protocol)协议是3GPP(第三代合作伙伴计划)在构建下一代通信网络(NGN)时的核心...了解并掌握SIP协议的工作原理和主要功能,对于理解并开发下一代通信系统至关重要。

    用C#实现的SIP Proxy

    首先,我们需要理解SIP Proxy的基本功能。SIP Proxy负责接收、转发和处理SIP消息,它可以在用户代理之间进行路由选择,执行认证、授权以及会话策略。SIP Proxy可以分为两种主要类型:无状态代理和有状态代理。无状态...

Global site tag (gtag.js) - Google Analytics