sip 认证分析
转自: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= "wang.guoliang2@zte.com.cn"
证书: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" | token
realm:让客户知道使用哪个用户名和密码的字符串。不同的领域可能密码不一样。至少告诉用户是什么主机做认证,他可能会提示用哪个用户名登录,类似一个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,用于Proxy
cnonce:如果qop设置,才设置,用于双向认证,防止攻击。
nonce-count:如果服务器看到同样的计数,就是一次重放。
示例:
401响应: HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest
realm="testrealm@host.com",
qop="auth,auth-int",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
再次请求:
Authorization: Digest username="Mufasa",
realm="testrealm@host.com",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
uri="/dir/index.html",
qop=auth,
nc=00000001,
cnonce="0a4f113b",
response="6629fae49393a05397450978507c4ef1",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
=================
图1-1 UA之间的认证流程
图1-2 UA和Proxy之间的认证流程
HTTP摘要认证
摘要访问认证是一种协议规定的Web服务器用来同网页浏览器进行认证信息协商的方法。它在密码发出前,先对其应用哈希函数,这相对于HTTP基本认证发送明文而言,更安全。
从技术上讲,摘要认证是使用随机数来阻止进行密码分析的MD5加密哈希函数应用。它使用HTTP协议。
目录
[隐藏]
概述[编辑]
摘要访问认证最初由 RFC 2069 (HTTP的一个扩展:摘要访问认证)中被定义。RFC 2069 大致定义了一个传统的由服务器生成随机数来维护安全性的摘要认证架构。认证响应由下列组成(HA1、HA2、A1、及A2为字符串变量的名称):
RFC 2069 随后被 RFC 2617 (HTTP 认证:基本及摘要访问认证)。RFC 2617 引入了一系列安全增强的选项;“保护质量”(qop)、随机数计数器由客户端增加、以及客户生成的随机数。这些增强为了防止如选择明文攻击的密码分析。
如果 qop 值为“auth”或未指定,那么 HA2 为
如果 qop 值为“auth-int”,那么 HA2 为
如果 qop 值为“auth”或“auth-int”,那么如下计算 response:
如果 qop 未指定,那么如下计算 response:
上面所述的这种当 qop 未指定的情况,也就是遵循简化的 RFC 2069 标准。
MD5 安全问题对摘要认证的影响[编辑]
在 HTTP 摘要认证中使用 MD5 加密是为了达成"不可逆的",也就是说,当输出已知的时候,确定原始的输入应该是相当困难的。如果密码本身太过简单,也许可以通过尝试所有可能的输入来找到对应的输出(穷举攻击),甚至可以通过字典或者适当的查找表加快查找速度。
HTTP 构架由Phillip Hallam-Baker于1993年在CERN设计成的,并且没有吸收后续认证系统的改进,如基于密钥的哈希消息认证代码HMAC的发展。虽然所使用的密码结构是基于MD5哈希函数的,在2004年,通常认为冲突攻击不会影响明文(如密码)未被得知的应用。[1][来源请求] 但是,在2006年的声明 (Kim, Biryukov2, Preneel, Hong, "On the Security of HMAC and NMAC Based on HAVAL MD4 MD5 SHA-0 and SHA-1") 导致了一些包括关于 MD5 应用的疑虑。不过,至今为止,MD5 冲突攻击没有被视为对摘要认证的威胁,并且 RFC 2617 允许服务器实现一些机制来检测冲突以及重放攻击。
HTTP摘要认证的考虑[编辑]
优势[编辑]
HTTP摘要认证目的在于比传统摘要认证构架更安全;例如,“明显强于(如)CRAM-MD5……”。 (RFC 2617)
一些HTTP摘要认证的安全性增强如下:
- 密码并非直接在摘要中使用,而是 HA1 = MD5(username:realm:password)。这就允许一些实现(如,JBossDIGESTAuth)仅存储 HA1 而不是明文密码。
- 在 RFC 2617 中引入了客户端随机数 nonce,这将使客户端能够防止选择明文攻击(否则,像Rainbow table这类东西就会成为摘要认证构架的威胁)。
- 服务器随机数 nonce 允许包含时间戳。因此服务器可以检查客户端提交的随机数 nonce,以防止重放攻击。
- 服务器也可以维护一个最近发出或使用过的服务器随机数nonce的列表以防止重用。
劣势[编辑]
摘要访问认证有意成为一个安全性的折衷。它意图代替非加密的HTTP基本认证。但是,它没有被设计为替换强认证协议,例如公钥密码学或Kerberos认证。
在安全性方面,摘要访问认证有几个缺点:
- RFC 2617 中的许多安全选项都是可选的。如果服务器没有指定保护质量(qop),客户端将以降低安全性的早期的RFC 2069 的模式操作。
- 摘要访问认证容易受到中间人攻击。举例而言,一个中间人攻击者可以告知客户端使用基本访问认证或早期的RFC 2069摘要访问认证模式。进一步而言,摘要访问认证没有提供任何机制帮助客户端验证服务器的身份。
- 一些服务器要求密码以可逆加密算法存储。但是,仅存储用户名、realm、和密码的摘要是可能的。[2]
- 它阻止了使用强密码哈希函数(如bcrypt)保存密码(因为无论是密码、或者用户名、realm、密码的摘要都要求是可恢复的)。
可替代的认证协议[编辑]
一些可以用于Web应用程序的强认证协议包括:
- 公钥密码学认证(通常随 HTTPS / SSL客户端整数一起实现)。
- Kerberos或SPNEGO认证,主要是在配置为Integrated Windows Authentication (IWA)的微软的IIS使用。
- Secure Remote Password protocol (适用于HTTPS / TLS层)。
常用的弱明文协议:
使用HTTPS网络加密同时使用这些弱明文协议解决了许多摘要访问认证试图要防止的许多威胁。
示例及说明[编辑]
下面的例子出自 RFC 2617,在这里进行了扩展,对每一个请求和响应显示出完整的文本。注意,这里仅仅涵盖了“auth”保护质量的代码,因为在撰写期间,所知道的只有Opera和Konqueror网页浏览器支持“auth-int”(带完整性保护的认证)。虽然定义中提到了HTTP 1.1,但是该构架可以像下面所描述的这样添加到1.0的服务器中去。
典型的认证过程包括如下步骤。
- 客户端请求一个需要认证的页面,但是不提供用户名和密码。通常这是由于用户简单的输入了一个地址或者在页面中点击了某个超链接。
- 服务器返回401 "Unauthorized" 响应代码,并提供认证域(realm),以及一个随机生成的、只使用一次的数值,称为密码随机数 nonce。
- 此时,浏览器会向用户提示认证域(realm)(通常是所访问的计算机或系统的描述),并且提示用户名和密码。用户此时可以选择取消。
- 一旦提供了用户名和密码,客户端会重新发送同样的请求,但是添加了一个认证头包括了响应代码。
- 在这个例子中,服务器接受了认证并且返回了请求页面。如果用户名非法和/或密码不正确,服务器将返回"401"响应代码,然后客户端会再次提示用户输入用户名及密码。
注意:客户端可能已经拥有了用户名和密码,因此不需要提示用户,比如以前存储在浏览器里的。
- 客户端请求 (无认证)
GET /dir/index.html HTTP/1.0
Host: localhost
- 服务器响应
HTTP/1.0 401 Unauthorized
Server: HTTPd/0.9
Date: Sun, 10 Apr 2005 20:26:47 GMT
WWW-Authenticate: Digest realm="testrealm@host.com",
qop="auth,auth-int",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
Content-Type: text/html
Content-Length: 311 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML>
<HEAD>
<TITLE>Error</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
</HEAD>
<BODY><H1>401 Unauthorized.</H1></BODY>
</HTML>
- 客户端请求 (用户名 "Mufasa", 密码 "Circle Of Life")
GET /dir/index.html HTTP/1.0
Host: localhost
Authorization: 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 OK
Server: HTTPd/0.9
Date: Sun, 10 Apr 2005 20:27:03 GMT
Content-Type: text/html
Content-Length: 7984
(随后是一个空行,然后是所请求受限制的HTML页面).
如下所述,response 值由三步计算而成。当多个数值合并的时候,使用冒号作为分割符。
- 对用户名、认证域(realm)以及密码的合并值计算 MD5 哈希值,结果称为 HA1。
- 对HTTP方法以及URI的摘要的合并值计算 MD5 哈希值,例如,
"GET"
和"/dir/index.html"
,结果称为 HA2。 - 对 HA1、服务器密码随机数(nonce)、请求计数(nc)、客户端密码随机数(cnonce)、保护质量(qop)以及 HA2 的合并值计算 MD5 哈希值。结果即为客户端提供的 response 值。
因为服务器拥有与客户端同样的信息,因此服务器可以进行同样的计算,以验证客户端提交的 response 值的正确性。在上面给出的例子中,结果是如下计算的。 (MD5()
表示用于计算 MD5 哈希值的函数;“\”表示接下一行;引号并不参与计算)
完成 RFC 2617 中所给出的示例,将在每步得出如下结果。
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 摘要认证[编辑]
SIP基本上使用了同样的摘要认证算法。它由 RFC 3261 定义。
浏览器实现[编辑]
大多数浏览器都基本上实现了该协议,除了某些特性,比如检查auth-int、或者MD5-sess算法。如果服务器要求处理这类可选特性,客户端可能无法进行认证(虽然需要注意的是,Apache服务器的mod_auth_digest模块也没有完全实现 RFC 2617)。
- Amaya
- 基于Gecko: (不包括 auth-int: [1])
- iCab 3.0.3+
- 基于KHTML- 及 WebKit: (不包括 auth-int [2])
- 基于Tasman:
- Trident-based:
- Internet Explorer 7+ [4] (不包括 auth-int)
- 基于Presto:
参见[编辑]
参考[编辑]
- ^ Hash Collision Q&A. (date unidentified) [2010-07-02]. (原始内容存档于2004-09-01). 注意:没有给出具体信息;需要引用该页的准确的版本。
- ^ http://tools.ietf.org/html/rfc2617#section-4.13
- ^ http://www.w3.org/Protocols/HTTP/1.0/spec.html#Request
- ^ http://httpd.apache.org/docs/2.2/mod/mod_auth_digest.html#msie
外部链接[编辑]
http://zh.wikipedia.org/wiki/HTTP%E6%91%98%E8%A6%81%E8%AE%A4%E8%AF%81#SIP_.E6.91.98.E8.A6.81.
sip 认证分析的更多相关文章
- SIP 认证
理解SIP的认证 1. 认证和加密 认证(Authorization)的作用在于表明自己是谁,即向别人证明自己是谁.而相关的概念是MD5,用于认证安全.注意MD5仅仅是个hash函数而已,并不是 ...
- SIP 认证方式
SIP认证是继承了HTTP的认证方式.HTTP的认证方案主要有Basic Authentication Scheme和Digest Access Authentication Scheme两种.而Ba ...
- SIP协议分析
- SIP流程 一个标准的SIP通话流程如下: 1. A向B发送一个INVITE消息,邀请B通话. 2.B振铃,向A回复一个RING消息,通知A振铃中,A等待. 3.B提机,向A发一个OK消息, 通 ...
- HTTP SIP 认证
HTTP请求报头: Authorization HTTP响应报头: WWW-Authenticate HTTP认证 基于 质询 /回应( challenge/response)的认证模式. ...
- 抓包分析SIP消息
I. 实验环境 SIP服务器: Yate服务器, IP:port=10.15.3.34:5060 SIP客户端: 移植Sipdroid的Android网络电话软件, IP: 10.15.3.73, A ...
- 基于GBT28181:SIP协议组件开发-----------第三篇SIP注册流程分析实现
原创文章,引用请保证原文完整性,尊重作者劳动,原文地址http://www.cnblogs.com/qq1269122125/p/3941172.html,qq:1269122125. 上两章节简要的 ...
- sip鉴权认证算法详解及python加密
1. 认证和加密 认证(Authorization)的作用在于表明自己是谁,即向别人证明自己是谁.而相关的概念是MD5,用于认证安全.注意MD5仅仅是个hash函数而已,并不是用于加密.因为ha ...
- 技术分享|MySQL caching_sha2_password认证异常问题分析
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 0. 导读 相同的账号.密码,手动客户端连接可以成功,通过MySQL Conne ...
- 《FreeSWITCH: VoIP实战》:SIP 模块 - mod_sofia
SIP 模块是 FreeSWITCH 的主要模块,所以,值得拿出专门一章来讲解. 在前几章时里,你肯定见过几次 sofia 这个词,只是或许还不知道是什么意思.是这样的,Sofia-SIP 是由诺基亚 ...
随机推荐
- [tools]python的mkdocs模块分分钟将md搞成一个网站
docusaurus: facebook出的一个文档生成器,用起来感觉没那么友善 hugo: 这个很棒 python的mkdocs模块: 用起来最简单 python的这个模块可以分分钟将一坨md假设成 ...
- Centos7安装TensorFlow
TensorFlow也火了一段时间,想想既然要研究NLP.为什么不好好应用一下Google开源的Deep Learning平台呢,一切还是先从搭建好开发环境開始. 非常多大神们也做了这方面的工作.汲取 ...
- SQL Server 备份数据库到指定路径,任务实现
--Description:备份指定数据到指定路径,第一次完整备份.每月1号完整备份.每周一完整,每天增量备份--====================================ALTER p ...
- 理解HTTP幂等性,分布式事物
理解HTTP幂等性 基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式.无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的Web API.为什么 ...
- hdoj1010 Temperor of the bone
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- Livepool
LivePool Fiddler Like cross platform debugging proxy for web developers base on NodeJS LivePool 是一个基 ...
- 关于Snmp的Trap代码开发之坑
最近是被这个snmp的trap给坑了,其实回想起来主要是对这个不了解.特别是对snmp协议研究不够深入, 真的不想看这些协议东西,只想大概知道.结果在开发snmp trap时候被坑了,下面列下自己踩到 ...
- Python2 获取两日期之间的每一天
import datetime def getEveryDay(begin_date,end_date): date_list = [] begin_date = datetime.datetime. ...
- js判断字符是否存在汉字的方法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- eclipse egit 报错 The current branch is not configured for pull No value for key branch.master
eclipse egit 插件 pull报错 The current branch is not configured for pull No value for key branch.master ...