`

基于HTTP 协议认证介绍与实现

阅读更多
原帖地址:http://www.cnblogs.com/youxilua/archive/2013/06/15/3137236.html

导言


一直对http 的头认证有兴趣,就是路由器的那种弹出对话框输入账号密码怎么实现一直不明白,最近,翻了一下http 协议,发现这是一个RFC 2617的实现,所以写篇文章介绍一下吧.


Http基本认证


这是一个用于web浏览器或其他客户端在请求时提供用户名和密码的登录认证,要实现这个认证很简单:


我们先来看下协议里面怎么定义这个认证的. 1. 编码: 将用户名 追加一个 冒号(':')接上密码,把得出的结果字符串在用Base64算法编码.



  1. 请求头: Authorization: 认证类型 编码字符串


来看一下客户端如何发起请求例如,有一个用户名为:tom, 密码为:123456 怎么认证呢?


步骤如下 1. 编码



Base64('tom:123456') == dG9tOjEyMzQ1Ng==;




  1. 把编码结果放到请求头当中

    Authorization: Basic dG9tOjEyMzQ1Ng==





请求样例客户端


 










1
2
3


GET / HTTP/1.1
Host: localhost
Authorization: Basic dG9tOjEyMzQ1Ng


服务端应答


 


 










1
2
3
4


HTTP/1.1 200 OK
Date: Thu, 13 Jun 2013 20:25:37 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 53


如果没有认证信息


 


 










1
2
3


HTTP/1.1 401 Authorization Required
Date: Thu, 13 Jun 2013 20:25:37 GMT
WWW-Authenticate: Basic realm="Users"


验证失败的时候,响应头加上WWW-Authenticate: Basic realm="请求域".


 


这种http 基本实现,几乎目前所有浏览器都支持.不过,大家可以发现,直接把用户名和密码只是进行一次base64 编码实际上是很不安全的,因为对base64进行反编码十分容易,所以这种验证虽然简便,但是很少会在公开访问的互联网使用,一般多用在小的私有系统,例如,你们家里头的路由器,多用这种认证方式.


Http 摘要认证


这个认证可以看做是基本认证的增强版本,使用随机数+密码进行md5,防止通过直接的分析密码MD5防止破解. 摘要访问认证最初由 RFC 2069 (HTTP的一个扩展:摘要访问认证)中被定义加密步骤:




  1. ha1




  2. ha2 




  3. res




后来发现,就算这样还是不安全(md5 可以用彩虹表进行攻击),所以在RFC 2617入了一系列安全增强的选项;“保护质量”(qop)、随机数计数器由客户端增加、以及客户生成的随机数。这些增强为了防止如选择明文攻击的密码分析。



d1





  1. 如果 qop 值为“auth”或未指定,那么 HA2 为



    d3





  2. 如果 qop 值为“auth-int”,那么 HA2 为



    d3





  3. 如果 qop 值为“auth”或“auth-int”,那么如下计算 response:



    d4





  4. 如果 qop 未指定,那么如下计算 response:



    d5





好了,知道加密步骤,下面我们用文字来描述一下;


最后,我们的response 由三步计算所得. 1. 对用户名、认证域(realm)以及密码的合并值计算 MD5 哈希值,结果称为 HA1。



HA1 = MD5( "tom:Hi!:123456" ) = d8ae91c6c50fabdac442ef8d6a68ae8c





  1. 对HTTP方法以及URI的摘要的合并值计算 MD5 哈希值,例如,"GET" 和 "/index.html",结果称为 HA2。



    HA2 = MD5( "GET:/" ) = 71998c64aea37ae77020c49c00f73fa8





  2. 最后生成的响应码



    Response = MD5("d8ae91c6c50fabdac442ef8d6a68ae8c:L4qfzASytyQJAC2B1Lvy2llPpj9R8Jd3:00000001:c2dc5b32ad69187a
    :auth:71998c64aea37ae77020c49c00f73fa8") = 2f22e6d56dabb168702b8bb2d4e72453;








RFC2617 的安全增强的主要方式:


发起请求的时候,服务器会生成一个密码随机数(nonce)(而这个随机数只有每次"401"相应后才会更新),为了防止攻击者可以简单的使用同样的认证信息发起老的请求,于是,在后续的请求中就有一个随机数计数器(cnonce),而且每次请求必须必前一次使用的打.这样,服务器每次生成新的随机数都会记录下来,计数器增加.在RESPONSE 码中我们可以看出计数器的值会导致不同的值,这样就可以拒绝掉任何错误的请求.


请求样例(服务端 qop 设置为"auth")


客户端 无认证


 










1
2


GET / HTTP/1.1
Host: localhost


服务器响应(qop 为 'auth')


 


 










1
2
3


HTTP/1.1 401 Authorization Required
Date: Thu, 13 Jun 2013 20:25:37 GMT
WWW-Authenticate: Digest realm="Hi!", nonce="HSfb5dy15hKejXAbZ2VXjVbgNC8sC1Gq", qop="auth"


客户端请求(用户名: "tom", 密码 "123456")


 


 










1
2
3
4
5
6
7
8
9


GET / HTTP/1.1
Host: localhost
Authorization: Digest username="tom",
realm="Hi!",
nonce="L4qfzASytyQJAC2B1Lvy2llPpj9R8Jd3",
uri="/",
qop=auth,
nc=00000001,
cnonce="c2dc5b32ad69187a", response="2f22e6d56dabb168702b8bb2d4e72453"


服务端应答


 


 










1
2
3
4


HTTP/1.1 200 OK
Date: Thu, 13 Jun 2013 20:25:37 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 53


注意qop 设置的时候慎用:auth-int,因为一些常用浏览器和服务端并没有实现这个协议.

本文链接

分享到:
评论

相关推荐

    基于Python实现的SKey身份认证协议.zip

    本项目中S/Key协议认证过程 1.客户端连接服务器,提示用户输入用户名,将输入的用户名发送到服务器 2.服务器在用户信息字典中查询,根据用户名是否存在向客户端发送不同的反馈信息 3.客户端收到反馈信息,根据内容...

    C# 实现S/Key身份认证协议

    S/Key身份认证协议是一种基于一次性口令(One-Time Password, OTP)的强身份验证方法,主要用于增强网络安全性。在C#中实现S/Key协议,可以为应用程序提供更高级别的用户验证保护,防止恶意攻击者通过重放攻击或者密码...

    毕业设计:python WEB 服务统一身份认证协议设计与实现(源码 + 数据库 + 说明文档)

    毕业设计:python WEB 服务统一身份认证协议设计与实现(源码 + 数据库 + 说明文档) 第2章 系统分析 9 2.1可行性分析 9 2.1.1技术可行性 9 2.1.2操作可行性 9 2.1.3经济可行性 9 2.2设计的基本思想 9 2.3基础功能...

    基于SIP协议的软电话的设计与实现.pdf

    ### 基于SIP协议的软电话设计与实现的核心知识点 #### 1. SIP协议概览 SIP(Session Initiation Protocol),即会话初始化协议,是IETF(Internet Engineering Task Force)定义的一种应用层控制协议,专门用于...

    基于MAC地址的Radius认证在Linux下的实现.pdf

    基于MAC地址的Radius认证在Linux下的实现 在计算机网络技术飞速发展的今天,信息安全已经成为计算机网络安全中一个非常重要的内容。客户认证技术是计算机网络安全中最常用、最普遍的一种认证技术。Radius认证是客户...

    ISAPI协议摘要认证实现方法介绍1

    在ISAPI(Internet Server Application Programming Interface)协议中,摘要认证是确保基于HTTP REST架构的应用程序安全的重要手段。相比Basic认证,摘要认证提供了更高的安全级别,因为它不直接传输用户名和密码,...

    基于HTTP协议的开发接口

    在描述中提到的"基于HTTP协议的开发接口",通常是指开发者通过HTTP协议来设计和实现的API(Application Programming Interface)。这些接口允许应用程序与服务器进行交互,执行特定的操作,如发送短信或接收短信。...

    基于HDCP协议的认证研究与流加密算法的实现

    《基于HDCP协议的认证研究与流加密算法的实现》 在当今数字视听领域,保护数字内容的安全传输已经成为至关重要的问题。High-bandwidth Digital Content Protection(HDCP)协议就是为了防止未经许可的复制和传播而...

    基于TCPIP协议的网络聊天软件的设计与实现

    《基于TCP/IP协议的网络聊天软件的设计与实现》 在当今信息化社会,网络通信已经成为人们日常生活和工作中不可或缺的一部分。TCP/IP(Transmission Control Protocol/Internet Protocol)协议是互联网的基础,为...

    基于Linux的用户认证与授权系统的研究实现

    本课程设计在对可信计算的体系结构、Linux的安全机制、现有的认证协议等深入研究的基础上,提出了基于Linux操作系统的用户认证与应用授权的架构,并最终完成了整个系统的搭建。本文重点分析了Kerberos认证系统与LDAP...

    论文研究-基于身份的无线局域网认证协议设计与实现.pdf

    无线局域网应用越来越广泛,而安全问题是决定其发展的一个重要因素。首先提出了无线局域网中基于身份的加密和签名方案,基于加密和...进一步提出了基于身份的无线局域网认证协议;最后阐述了协议实现的硬件环境和流程。

    基于TCPIP协议实现上位机对UR机器人的远程控制.rar

    本主题聚焦于“基于TCP/IP协议实现上位机对UR机器人的远程控制”,这是一项利用网络通信技术来实现远程操作和监控UR机器人的重要技术。下面我们将详细探讨这一技术的原理、步骤以及实现过程中可能遇到的关键知识点。...

    基于TCP协议的简单即时通信软件的设计与实现(含源文件).pdf

    SOCKET作为操作系统提供的API,允许程序员在应用层直接与传输层进行交互,实现TCP/IP协议的编程。无论是UNIX还是Windows系统,都内核级地支持SOCKET接口,从而保证了跨平台的兼容性。利用SOCKET,开发者可以创建连接...

    3G的认证与密钥分配协议

    3G 系统的认证与密钥分配协议是基于 GSM 的基础上建立起来的,旨在提供一个安全的认证和密钥分配机制。该协议通过在 MS 和 HLR 之间共享的密码,实现了 MS 和 HLR 之间的双向认证。该协议的过程中有三个实体参与,即...

    基于身份密码系统和区块链的跨域认证协议.pdf

    本文提出了一种基于身份密码系统和区块链的跨域认证协议,以解决异构网络环境中用户访问不同信任域网络服务时的跨域身份认证问题。该协议基于NC身份密码系统,结合区块链技术的分布式对等网络架构,提出了一种联盟链...

    ASP.NET基于TCP协议的简单即时通信软件的设计与实现(源代码+论文).zip

    在这个项目中,我们探讨的是如何利用ASP.NET实现一个基于TCP协议的简单即时通信软件。TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,它确保了数据包的有序和无损传输,非常适合于即时...

    Python基于SSH协议实现Linux系统远程管理方法研究.pdf

    在实际应用中,Python通过Paramiko库在SSH协议基础上实现的远程管理功能,具有灵活性和扩展性,能够满足复杂网络环境下的管理需求。管理员可以在Python脚本中编写复杂的逻辑,自动执行日常的运维任务,从而提高工作...

Global site tag (gtag.js) - Google Analytics