转自:http://blog.csdn.net/wangqi0079/article/details/11569489
SIP类似Http协议。其认证模式也一样。Http协议(RFC 2616 )规定可以采用Basic模式和摘要模式(Digest schema)。RFC 2617 专门对两种认证模式做了规定。RFC 1321 是MD5标准。Digest对现代密码破解来说并不强壮,但比基本模式还是好很多。
1、基本认证模式
客户向服务器发送请求,服务器返回401(未授权),要求认证。401消息的头里面带了challenge信息。realm用以区分要不同认证的部分。客户端收到401后,将用户名密码和challenge信息用BASE64加密形成证书,发送回服务器认证。语法如下: challenge = "Basic" realm credentials = "Basic" basic-credentials示例: 认证头: WWW-Authenticate: Basic realm= "" 证书:Authorization: Basic QsdfgWGHffuIcaNlc2FtZQ
2、摘要访问认证
在客户发送请求后,收到一个401(未授权)消息,包含一个Challenge。消息里面有一个唯一的字符串:nonce,每次请求都不一样。客户将用户名密码和401消息返回的Challenge一起加密后传给服务器。语法如下: challenge = "Digest" digest-challenge digest-challenge = 1#( realm | [ domain ] | nonce | [opaque] |[stale] | [algorithm] | [qop-options] | [auth-param] ) domain = "domain" "=" <"> URI ( 1*SP URI ) <"> URI = absoluteURI | abs_path nonce = "nonce" "=" nonce-value nonce-value = quoted-string opaque = "opaque" "=" quoted-string stale = "stale" "=" ( "true" | "false" ) algorithm = "algorithm" "=" ( "MD5" | "MD5-sess" | token ) qop-options = "qop" "=" <"> 1#qop-value <"> qop-value = "auth" | "auth-int" | tokenrealm:让客户知道使用哪个用户名和密码的字符串。不同的领域可能密码不一样。至少告诉用户是什么主机做认证,他可能会提示用哪个用户名登录,类似一个Email。domain:一个URI列表,指示要保护的域。可能是一个列表。提示用户这些URI采用一样的认证。如果为空或忽略则为整个服务器。nonce:随机字符串,每次401都不一样。跟算法有关。算法类似Base64加密:time-stamp H(time-stamp ":" ETag ":" private-key) 。time-stamp为服务器时钟,ETag为请求的Etag头。private-key为服务器知道的一个值。opaque:服务器产生的由客户下去请求时原样返回。最好是Base64串或十六进制字符串。auth-param:为扩展用的,现阶段忽略。其他域请参考RFC2617。授权头语法: credentials = "Digest" digest-response digest-response = 1#( username | realm | nonce | digest-uri | response | [ algorithm ] | [cnonce] | [opaque] | [message-qop] | [nonce-count] | [auth-param] ) username = "username" "=" username-value username-value = quoted-string digest-uri = "uri" "=" digest-uri-value digest-uri-value = request-uri ; As specified by HTTP/1.1 message-qop = "qop" "=" qop-value cnonce = "cnonce" "=" cnonce-value cnonce-value = nonce-value nonce-count = "nc" "=" nc-value nc-value = 8LHEX response = "response" "=" request-digest request-digest = <"> 32LHEX <"> LHEX = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "a" | "b" | "c" | "d" | "e" | "f"response:加密后的密码digest-uri:拷贝Request-Line,用于Proxycnonce:如果qop设置,才设置,用于双向认证,防止攻击。nonce-count:如果服务器看到同样的计数,就是一次重放。示例:401响应: HTTP/1.1 401 Unauthorized WWW-Authenticate: Digest realm="", qop="auth,auth-int", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41"再次请求: Authorization: Digest username="Mufasa", realm="", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", uri="/dir/index.html", qop=auth, nc=00000001, cnonce="0a4f113b", response="6629fae49393a05397450978507c4ef1", opaque="5ccc069c403ebaf9f0171e9517f40e41"=================
图1-1 UA之间的认证流程
图1-2 UA和Proxy之间的认证流程
HTTP摘要认证
摘要访问认证是一种协议规定的用来同进行认证信息协商的方法。它在发出前,先对其应用,这相对于发送而言,更安全。
从技术上讲,摘要认证是使用来阻止进行的应用。它使用协议。
目录
[]概述[]
摘要访问认证最初由 (HTTP的一个扩展:摘要访问认证)中被定义。 大致定义了一个传统的由服务器生成来维护安全性的摘要认证架构。认证响应由下列组成(HA1、HA2、A1、及A2为字符串变量的名称):
随后被 (HTTP 认证:基本及摘要访问认证)。 引入了一系列安全增强的选项;“保护质量”(qop)、随机数计数器由客户端增加、以及客户生成的随机数。这些增强为了防止如的。
如果 qop 值为“auth”或未指定,那么 HA2 为
如果 qop 值为“auth-int”,那么 HA2 为
如果 qop 值为“auth”或“auth-int”,那么如下计算 response:
如果 qop 未指定,那么如下计算 response:
上面所述的这种当 qop 未指定的情况,也就是遵循简化的 标准。
MD5 安全问题对摘要认证的影响[]
在 HTTP 摘要认证中使用 MD5 加密是为了达成"不可逆的",也就是说,当输出已知的时候,确定原始的输入应该是相当困难的。如果密码本身太过简单,也许可以通过尝试所有可能的输入来找到对应的输出(),甚至可以通过字典或者适当的查找表加快查找速度。
HTTP 构架由于1993年在设计成的,并且没有吸收后续认证系统的改进,如基于密钥的哈希消息认证代码的发展。虽然所使用的结构是基于哈希函数的,在2004年,通常认为不会影响明文(如密码)未被得知的应用。 但是,在2006年的声明 (Kim, Biryukov2, Preneel, Hong, ) 导致了一些包括关于 MD5 应用的疑虑。不过,至今为止,MD5 冲突攻击没有被视为对摘要认证的威胁,并且 允许服务器实现一些机制来检测冲突以及。
HTTP摘要认证的考虑[]
优势[]
HTTP摘要认证目的在于比传统摘要认证构架更安全;例如,“明显强于(如)……”。 ()
一些HTTP摘要认证的安全性增强如下:
- 密码并非直接在摘要中使用,而是 HA1 = MD5(username:realm:password)。这就允许一些实现(如,)仅存储 HA1 而不是密码。
- 在 中引入了客户端,这将使客户端能够防止(否则,像这类东西就会成为摘要认证构架的威胁)。
- 服务器随机数 nonce 允许包含时间戳。因此服务器可以检查客户端提交的随机数 nonce,以防止。
- 服务器也可以维护一个最近发出或使用过的服务器随机数nonce的列表以防止重用。
劣势[]
摘要访问认证有意成为一个安全性的折衷。它意图代替非加密的。但是,它没有被设计为替换强认证协议,例如或认证。
在安全性方面,摘要访问认证有几个缺点:
- 中的许多安全选项都是可选的。如果服务器没有指定保护质量(qop),客户端将以降低安全性的早期的 的模式操作。
- 摘要访问认证容易受到。举例而言,一个中间人攻击者可以告知客户端使用基本访问认证或早期的摘要访问认证模式。进一步而言,摘要访问认证没有提供任何机制帮助客户端验证服务器的身份。
- 一些服务器要求密码以可逆加密算法存储。但是,仅存储用户名、realm、和密码的摘要是可能的。
- 它阻止了使用强密码哈希函数(如)保存密码(因为无论是密码、或者用户名、realm、密码的摘要都要求是可恢复的)。
可替代的认证协议[]
一些可以用于Web应用程序的强认证协议包括:
- 认证(通常随 / 客户端整数一起实现)。
- 或认证,主要是在配置为 (IWA)的使用。
- (适用于 / 层)。
常用的弱明文协议:
- 构架
使用HTTPS网络加密同时使用这些弱明文协议解决了许多摘要访问认证试图要防止的许多威胁。
示例及说明[]
下面的例子出自 ,在这里进行了扩展,对每一个请求和响应显示出完整的文本。注意,这里仅仅涵盖了“auth”保护质量的代码,因为在撰写期间,所知道的只有和支持“auth-int”(带完整性保护的认证)。虽然定义中提到了HTTP 1.1,但是该构架可以像下面所描述的这样添加到1.0的服务器中去。
典型的认证过程包括如下步骤。
- 客户端请求一个需要认证的页面,但是不提供和。通常这是由于用户简单的输入了一个地址或者在页面中点击了某个。
- 服务器返回 "Unauthorized" 响应代码,并提供认证域(realm),以及一个随机生成的、只使用一次的数值,称为。
- 此时,浏览器会向用户提示认证域(realm)(通常是所访问的计算机或系统的描述),并且提示用户名和密码。用户此时可以选择取消。
- 一旦提供了用户名和密码,客户端会重新发送同样的请求,但是添加了一个认证头包括了响应代码。
- 在这个例子中,服务器接受了认证并且返回了请求页面。如果用户名非法和/或密码不正确,服务器将返回"401"响应代码,然后客户端会再次提示用户输入用户名及密码。
注意:客户端可能已经拥有了用户名和密码,因此不需要提示用户,比如以前存储在浏览器里的。
- 客户端请求 (无认证)
GET /dir/index.html HTTP/1.0Host: localhost
(跟随一个新行,形式为一个再跟一个)
- 服务器响应
HTTP/1.0 401 UnauthorizedServer: HTTPd/0.9Date: Sun, 10 Apr 2005 20:26:47 GMTWWW-Authenticate: Digest realm="testrealm@host.com", qop="auth,auth-int", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="5ccc069c403ebaf9f0171e9517f40e41"Content-Type: text/htmlContent-Length: 311Error 401 Unauthorized.
- 客户端请求 (用户名 "Mufasa", 密码 "Circle Of Life")
GET /dir/index.html HTTP/1.0Host: localhostAuthorization: Digest username="Mufasa", realm="testrealm@host.com", nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", uri="/dir/index.html", qop=auth, nc=00000001, cnonce="0a4f113b", response="6629fae49393a05397450978507c4ef1", opaque="5ccc069c403ebaf9f0171e9517f40e41"
(跟随一个新行,形式如前所述).
- 服务器响应
HTTP/1.0 200 OKServer: HTTPd/0.9Date: Sun, 10 Apr 2005 20:27:03 GMTContent-Type: text/htmlContent-Length: 7984
(随后是一个空行,然后是所请求受限制的HTML页面).
如下所述,response 值由三步计算而成。当多个数值合并的时候,使用作为分割符。
- 对用户名、认证域(realm)以及密码的合并值计算 MD5 哈希值,结果称为 HA1。
- 对HTTP方法以及的摘要的合并值计算 MD5 哈希值,例如,
"GET"
和"/dir/index.html"
,结果称为 HA2。 - 对 HA1、服务器密码随机数(nonce)、请求计数(nc)、客户端密码随机数(cnonce)、保护质量(qop)以及 HA2 的合并值计算 MD5 哈希值。结果即为客户端提供的 response 值。
因为服务器拥有与客户端同样的信息,因此服务器可以进行同样的计算,以验证客户端提交的 response 值的正确性。在上面给出的例子中,结果是如下计算的。 (MD5()
表示用于计算 MD5 哈希值的函数;“\”表示接下一行;引号并不参与计算)
完成 中所给出的示例,将在每步得出如下结果。
HA1 = MD5( "Mufasa:testrealm@host.com:Circle Of Life" ) = 939e7578ed9e3c518a452acee763bce9 HA2 = MD5( "GET:/dir/index.html" ) = 39aff3a2bab6126f332b942af96d3366 Response = MD5( "939e7578ed9e3c518a452acee763bce9:\ dcd98b7102dd2f0e8b11d0f600bfb0c093:\ 00000001:0a4f113b:auth:\ 39aff3a2bab6126f332b942af96d3366" ) = 6629fae49393a05397450978507c4ef1
此时客户端可以提交一个新的请求,重复使用服务器密码随机数(nonce)(服务器仅在每次“401”响应后发行新的nonce),但是提供新的客户端密码随机数(cnonce)。在后续的请求中,十六进制请求计数器(nc)必须比前一次使用的时候要大,否则攻击者可以简单的使用同样的认证信息老的请求。由服务器来确保在每个发出的密码随机数nonce时,计数器是在增加的,并拒绝掉任何错误的请求。显然,改变HTTP方法和/或计数器数值都会导致不同的 response 值。
服务器应当记住最近所生成的服务器密码随机数nonce的值。也可以在发行每一个密码随机数nonce后,记住过一段时间让它们过期。如果客户端使用了一个过期的值,服务器应该响应“401”状态号,并且在认证头中添加stale=TRUE
,表明客户端应当使用新提供的服务器密码随机数nonce重发请求,而不必提示用户其它用户名和口令。
服务器不需要保存任何过期的密码随机数,它可以简单的认为所有不认识的数值都是过期的。服务器也可以只允许每一个服务器密码随机数nonce使用一次,当然,这样就会迫使客户端在发送每个请求的时候重复认证过程。需要注意的是,在生成后立刻过期服务器密码随机数nonce是不行的,因为客户端将没有任何机会来使用这个nonce。
SIP 摘要认证[]
基本上使用了同样的摘要认证算法。它由 定义。
浏览器实现[]
大多数浏览器都基本上实现了该协议,除了某些特性,比如检查auth-int、或者MD5-sess算法。如果服务器要求处理这类可选特性,客户端可能无法进行认证(虽然需要注意的是,Apache服务器的mod_auth_digest模块也没有完全实现 )。
- 基于: (不包括 auth-int: )
- 基于- 及 : (不包括 auth-int )
- 4
- 基于:
- -based:
- (不包括 auth-int)
- 基于:
- 浏览器
- 的浏览器
- 浏览器
参见[]
参考[]
- . (date unidentified) [2010-07-02]. (存档于2004-09-01). 注意:没有给出具体信息;需要引用该页的准确的版本。