什么是Authentication?

首先解释两个长的非常像、easy混淆的单词,Authentication(鉴定、认证)Authorization(授权)

Authentication就是要证明你是谁。举个样例。你告诉别人你的名字叫Alice,怎么样让别人确信你就是Alice,这就是Authentication。

Authorization则是当别人已经相信是你以后。你是不是被允不同意做做某件事儿。比方,当你已经证明了你就是Alice了,你能够查你自己的信用卡刷卡记录,但不能查Bob的刷卡记录,这就是Authorization(当然,假设Alice是Bob的老婆这样的情况除外)。

这篇博客就主要看看HTTP Authentication究竟是怎么回事。

然后两种常见的Authentication机制:HTTP Basic和Digest。

HTTP Basic

顾名思义,HTTP Basic指的就是最简单的Authentication协议。简单到什么份儿上呢?直接方式告诉server你的username(username)和password(password)。

这里如果我们的username是Alice,password是123456。

我们使用curl訪问server

   curl -u Alice:123456 http://kiwiserver.com/secret -v



request头部:

GET /secret HTTP/1.1

 Authorization: Basic QWxpY2U6MTIzNDU2

 ...

我们这里看到发送的request头部中含有Authentication这个字段,其值为Basic QWxpY2U6MTIzNDU2。Basic表示的使用的是HTTP Basic Authentication。而QWxpY2U6MTIzNDU2。则是由“Alice:123456”进行Base64编码以后得到的结果。

response头部: 

 HTTP/1.1 200 OK

 ...

由于我们输入的是正确的usernamepassword。所以server会返回200,表示验证成功。假设我们用错误的用户的password来发送请求,则会得到类似例如以下含有401错误的response头部:

 HTTP/1.1 401 Bad credentials

 WWW-Authenticate: Basic realm="Spring Security Application"

 ...

乍看起来好像HTTP Basic还挺不错的。QWxpY2U6MTIzNDU2已经让人非常难看出来usernamepassword是什么了。可是,我们须要知道Base64编码是可逆的。也就是我们能够通过decode Base64的编码还原username和password。

在命令行输入例如以下命令:

   echo QWxpY2U6MTIzNDU2 | base64 -D

得到:

Alice:123456

轻松解密。试想。假设一个人通过一定的方法截获了Alice向server发送的请求,那不是非常easy就行得到她的username和password了吗?所以,为了保证用户的安全。我们不会直接通过HTTP的方式使用Basic Authentication。而是会使用HTTPS,这样更安全一些。

Replay Attack

通过前面介绍,我们知道了通过可逆的Base64的编码方式不是太靠谱。那我们在发送password之前,将password用不可逆的方式进行编码不就完了吗?

比方。前面Alice的password是123456,进行MD5编码

   md5 -s 123456

以后得到的就是

e10adc3949ba59abbe56e057f20f883e

这样不就是不可逆的了?恩。即使有一个叫Craig的家伙截获了我向server发送的usernamepassword。他也不知道我的password究竟是什么了。

的确,Craig拿到e10adc3949ba59abbe56e057f20f883e这个被md5 hash过的password也不知道Alice的password是什么。可是,假设Craig直接拿着这个字符串放在HTTP头部。再发送给server不就OK了?Craig这样就根本不用解密这个password也能装成“Alice”向server通信。

这就叫做Replay Attack。

HTTP Digest

为了避免被坏人使用Replay Attack,一个简单的想法就是。让我们每次向server发送的认证信息都“必须”是不一样的,这样Craig即使拿到了这个认证信息也没有办法进行replay attack了。那怎样让Alice每次向server发送的认证信息都是不一样的。同一时候可以让server知道这就是Alice呢?

这就引出了Digest Authentication了。

当Alice初次訪问server时,并不携带password。此时server会告知Alice一个随机生成的字符串(nonce)。然后Alice再将这个字符串与她的password123456结合在一起进行MD5编码,将编码以后的结果发送给server作为验证信息。

由于nonce是“每次”(并不一定是每次)随机生成的。所以Alice在不同的时间訪问server,其编码使用的nonce值应该是不同的。假设携带的是同样的nonce编码后的结果,server就觉得其不合法。将拒绝其訪问。这样。即使Craig可以截获Alice向server发送的请求,也没有办法使用replay attack冒充成Alice了。

我们还是能够使用curl来查看这一过程:

curl -u Alice:123456 http://kiwiserver.com/secret -v --digest

curl和server通信过程

curl -------- request1:GET ------->> Server

curl <<------ response1:nonce ------- Server

curl ---- request2:Digest Auth ----> Server

curl <<------- response2:OK --------  Server


request1头部:

 GET /secret HTTP/1.1

 ...

请求1中没有包括不论什么username和password信息



response1头部:

 HTTP/1.1 401
Full authentication is required to access this resource

 WWW-Authenticate: Digest realm="Contacts Realm via Digest Authentication", qop="auth",nonce="MTQwMTk3OTkwMDkxMzo3MjdjNDM2NTYzMTU2NTA2NWEzOWU2NzBlNzhmMjkwOA=="

 ...

当server接收到request1以后。觉得request1没有不论什么的Authentication信息。所以返回401,而且告诉curl nonce的值是MTQwMTk3OTkwMDkxMzo3MjdjNDM2NTYzMTU2NTA2NWEzOWU2NzBlNzhmMjkwOA



request2头部:


 GET /secret HTTP/1.1

 Authorization: Digest username="Alice", realm="Contacts Realm via Digest Authentication",nonce="MTQwMTk3OTkwMDkxMzo3MjdjNDM2NTYzMTU2NTA2NWEzOWU2NzBlNzhmMjkwOA==", uri="/secret", cnonce="MTQwMTk3", nc=00000001, qop="auth",response="fd5798940c32e51c128ecf88472151af"

 ...

curl接收到server的nonce值以后,就能够把如password等信息和nonce值放在一起然后进行MD5编码,得到一个response值,如前面红色标出所看到的,这样server就能够通过这个值验证Alice的password是否正确。

response2头部:

 HTTP/1.1 200 OK

 ...

当我们完毕Authentication以后,假设我们再次使用刚才的nonce值:

   curl -X GET http://kiwisecrect.com/secret -H 'Authorization: Digest username="Alice", realm="Contacts Realm via Digest Authentication", nonce="MTQwMTk3OTkwMDkxMzo3MjdjNDM2NTYzMTU2NTA2NWEzOWU2NzBlNzhmMjkwOA==",
uri="/secret", cnonce="MTQwMTk3", nc=00000001, qop="auth", response="fd5798940c32e51c128ecf88472151af"' -v

收到错误信息:

 HTTP/1.1 401 Incorrect response

 WWW-Authenticate: Digest realm="Contacts Realm via Digest Authentication", qop="auth", nonce="MTQwMTk4Mjg4MjQ5NjpjZmNiNzI2ZmFlNzA4Nzg3ZDUxNjk2YTEyMTU3OTc0Yg=="

Digest Authentication比Basic安全,可是并非真正的什么都不怕了。Digest Authentication这样的easy方式easy收到Man in the Middle攻击。

(待续)

版权声明:本文博客原创文章,博客,未经同意,不得转载。

小言HTTP Authentication的更多相关文章

  1. 小言C指针

            指针c语言,占据着重要的地位.终场前int.char.double其他类别似.它是一种数据类型,其特殊的原因int等基本类型的变量存储内容,针变量存放的是地址. 内存被划分成很多但愿区 ...

  2. Keepalived使用梳理

    keepalived介绍keepalived观察其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,它集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防 ...

  3. 使用keepalived及典型应用

    通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务. eg:当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短.栗子:下面来以keepaliv ...

  4. Keepalived安装使用详解

    简介 Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat.corosync.pacemaker. 但是它一般不会单独出现, ...

  5. Keepalived安装配置

    一.  介绍 keepalived:是一个类似于 layer3, 4 & 7 交换机制的软件,也就是我们平时说的第 3 层.第 4 层和第 7层交换. Keepalived 的作用是检测 we ...

  6. indexOf 和 lastIndexOf的区别

    indexOf 和  lastIndexOf 是什么? indexOf 和 lastIndexOf 都是索引文件 indexOf 是查某个指定的字符串在字符串首次出现的位置(索引值) (也就是从前往后 ...

  7. ie6下固定位置的实现

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. LinkedList源码阅读笔记(1.8)

    目录 LinkedList类的注解阅读 LinkedList类的定义 属性的定义 LinkedList构造器 核心方法 校验方法 普通方法 迭代器(iterator&ListIterator) ...

  9. 浅谈现公司的Spring Cloud微服务框架

    目录 说在前面 服务注册与发现 服务网关及熔断 配置中心 消息中心.服务链路追踪 小言 说在前面 本文偏小白,大佬慎入,若有错误或者质疑,欢迎留言提问,谢谢,祝大家新年快乐. spring cloud ...

随机推荐

  1. Unity 3D使用GameObject创建一个简单的可移动物体

    于Unity 3D游戏的开发.游戏脚本需要3D模拟组合,该脚本将被写入阻力3D为了达到效果对象. 以下是一个小实例,使用Unity 3D实现一个可控制移动的小人.小人能够向前.向后.向左和向右移动. ...

  2. 使用shell/python获取hostname/fqdn释疑(转)

    一直以来被Linux的hostname和fqdn(Fully Qualified Domain Name)困惑了好久,今天专门抽时间把它们的使用细节弄清了. 一.设置hostname/fqdn 在Li ...

  3. XCL-Charts画一个图(CurveChart)

    情节线图与往常不同的是,它是一个比较特殊线位置计算.所以我得到一个单独的类.相同.只需要输入数据源的基类, 加,控制要添加的.你可以画出你自己主动设置按照预期的效果. 代码: //图基类 chart ...

  4. EF操作sqlite数据库时的项目兼容性问题

    问题:vs2015打不开vs2010建的操作sqlite的实体数据模型edmx文件 原因: 当前电脑必须先安装:驱动库及sqlite的vs拓展 正常情况下安装驱动和拓展后,vs2015就应该可以正常打 ...

  5. Boost.Asio c++ 网络编程翻译(26)

    Boost.Asio-其他特性 这章我们讲了解一些Boost.Asio不那么为人所知的特性.标准的stream和streambuf对象有时候会更难用一些,但正如你所见.它们也有它们的益处.最后,你会看 ...

  6. Git 少用 Pull 多用 Fetch 和 Merge(转)

    英文原文:git: fetch and merge, don’t pull This is too long and rambling, but to steal a joke from Mark T ...

  7. NFS文件系统配置 和 GLIBC更新

    为了配置集群环境,把过程记录一下,方便后续使用 NFS 文件系统  是 network file system 配置好ssh无密码访问 ,各节点为centos6.5 主节点 在文件/etc/expor ...

  8. DWR入门的例子(一个)

    DWR(Direct Web Remoting)是WEB远程调用框架.使用这种框架使AJAX发展至今已成为非常easy.使用DWR能client利用JavaScript直接调用服务端的Java方法并返 ...

  9. JAVA学习笔记 -- JDBC及其应用

    一个.准备工作 1.开放SQL Server服务与支持TCP/IP  进一步确认TCPport watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjk ...

  10. twitter接口开发

    前一阵子研究了下twitter接口,发现网上的资料不是很多.遂花了些心血,终于有所收获~ 现在有时间赶紧整理出来便于自己以后查阅,也想帮助有困难的同学们.废话不多说,现在就以最简洁的方式开始了.注意: ...