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

导言

一直对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的一个扩展:摘要访问认证)中被定义加密步骤:

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

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

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

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

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

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

最后,我们的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,因为一些常用浏览器和服务端并没有实现这个协议.

时间: 2024-08-30 07:53:11

基于HTTP 协议认证介绍与实现的相关文章

HttpClient基于HTTP协议认证方案

简介 HttpClient支持三种不同形式的HTTP协议验证发难:Basic,Digest和NTLM.这些都可以解决同http服务器或是代理服务器之间的认证. 认证服务器 HttpClient处理服务器认证几乎是透明的,发开者只需要做一件事情,提供一个合法login证书.此证书被保存到HttpState实例中并且可调用方法setCredentials(AuthScopeauthscope, Credentials cred)和getCredentials(AuthScope authscope)

基于http协议的api接口对于客户端的身份认证方式以及安全措施[转]

基于http协议的api接口对于客户端的身份认证方式以及安全措施 由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服务器并与客户端的cookie中的jsessionid关联起来,这样客户端再次访问我们就可以识别用户身份了. 但是对于api服务器,我们不能让访问者先登录再进行访问这样不安全,也不友好.所以一般情况我们都是需要客户端提供一个key(每个

XMPP协议简单介绍

1为什么选择XMPP协议 在IETF 中,把IM协议划分为四种协议,即即时信息和出席协议(Instant Messaging and Presence Protocol, IMPP).出席和即时信息协议(Presence and Instant Messaging Protocol, PRIM).针对即时信息和出席扩展的会话发起协议(Session Initiation Protocol for Instant Messaging and Presence Leveraging Extensio

华为认证介绍

华为认证考试是由华为签约考试代理商Prometric公司进行的.它通过考试使网络专业人士有机会证明他们的组网知识和专业技术.考试时间一般为一个小时:根据考试科目,试题数量不等,一般为50-70题:题型为单选.多选.判断题.华为认证是华为技术有限公司(简称"华为")凭借多年信息通信技术人才培养经验,以及对行业发展的理解,基于ICT产业链人才个人职业发展生命周期,以层次化的职业技术认证为指引,搭载华为"云-管-端"融合技术,推出的覆盖IP.IT.CT以及ICT融合技术领

集成基于CAS协议的单点登陆

相信大家对单点登陆(SSO,Single Sign On)这个名词并不感到陌生吧?简单地说,单点登陆允许多个应用使用同一个登陆服务.一旦一个用户登陆了一个支持单点登陆的应用,那么在进入其它使用同一单点登陆服务的应用时就不再需要重新登陆了.而CAS协议则正是各单点登陆产品所需要实现的协议,其全称为Central Authentication Service. 那为什么要写这篇博客呢?这是因为在为公司的产品集成SSO的时候,我发现如果软件开发人员不了解CAS协议,那么他在集成出现错误的时候将完全没有

IOS基于XMPP协议开发--XMPPFramewok框架(一):基础知识

最近蘑菇街团队的TT的开源,使我对im产生了兴趣,然后在网上找到了XMPPFramework进行学习研究, 并写了以下系列教程供大家参考,有写的不对的地方,请大家多多包涵指正. 目录索引 IOS基于XMPP协议开发--XMPPFramewok框架(一):基础知识 IOS基于XMPP协议开发--XMPPFramewok框架(二):服务器连接 IOS基于XMPP协议开发--XMPPFramewok框架(三):用户注册 IOS基于XMPP协议开发--XMPPFramewok框架(四):用户认证 IOS

基于TCP协议之——socket编程

一. 套接字(socket) socket英文为插座的意思,也就是为用户提供了一个接入某个链路的接口.而在计算机网络中,一个IP地址标识唯一一台主机,而一个端口号标识着主机中唯一一个应用进程,因此"IP+端口号"就可以称之为socket. 两个主机的进程之间要通信,就可以各自建立一个socket,其实可以看做各自提供出来一个"插座",然后通过连接上"插座"的两头也就是由这两个socket组成的socket pair就标识唯一一个连接,以此来表示网

使用 AngularJS & NodeJS 实现基于 token 的认证应用(转)

认证是任何 web 应用中不可或缺的一部分.在这个教程中,我们会讨论基于 token 的认证系统以及它和传统的登录系统的不同.这篇教程的末尾,你会看到一个使用 AngularJS 和 NodeJS 构建的完整的应用. 一.传统的认证系统 在开始说基于 token 的认证系统之前,我们先看一下传统的认证系统. 用户在登录域输入 用户名 和 密码 ,然后点击 登录 : 请求发送之后,通过在后端查询数据库验证用户的合法性.如果请求有效,使用在数据库得到的信息创建一个 session,然后在响应头信息中

实现基于NTP协议的网络校时功能

无论PC端还是移动端系统都自带时间同步功能,基于的都是NTP协议,这里使用C#来实现基于NTP协议的网络校时功能(也就是实现时间同步). 1.NTP原理 NTP[Network Time Protocol]是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击. 先介绍下NTP数据包格式(其标准化文档为RFC2030,NTP版本