nonce和timestamp在Http安全协议中的作用
前段时间给客户网站做新浪微博账号登录功能,对OAuth协议以及相关的一些安全协议做了一些研究,顺便就记录一下学习心得吧。在这里就不打算具体讲OAuth的协议流程了,而是针对OAuth请求头里的nonce(随机数)、timestamp(时间戳)、signatrue(签名)这些参数的作用做一下总结。
首先看一下HTTP规范里定义的Basic认证。
Basic认证及其安全问题
Basic认证是一个流程比较简单的协议,整个过程可以分为以下三个步骤:
a) 客户端使用GET方法向服务器请求资源。
b) 服务器返回401响应码和WWW-Authentication:Basic realm=”Family”响应头要求客户端进行身份验证。其中realm声明了资源所在的域。
c) 浏览器接收到以上HTTP响应头后,弹出登录框要求用户输入用户名和密码;用户提交的用户名和密码通过冒号串联起来并对其进行BASE64编码后再提交到服务器;服务器对提交上来的BASE64字符串进行验证,如果验证通过则返回200响应码。
Basic认证虽然简单、方便,但它只能作为对非敏感资源的访问认证,因为它并不安全,主要表现在以下几个方面:
1、 客户端提交的用户名和密码只经过简单的编码,攻击者只要窃听到该数据包,便可很容易的将其反编码为原始用户名和密码。
2、 即使客户端使用了一种比BASE64更复杂的编码方式使得攻击者无法对其反编码,攻击者也可以使用fiddler等工具将拦截到的HTTP报文重新提交给服务器,服务器只对编码的字符串进行验证,所以验证同样能通过。这种攻击方法称之为重放攻击(Replay-Attack)。
以上两个问题也是各种身份认证协议需要考虑到的安全问题,包括OAuth、Digest认证、NTLM认证等等认证机制都使用了nonce和timestamp来解决这些问题。
Nonce、Timestamp——解决Replay-Attack问题
Nonce是由服务器生成的一个随机数,在客户端第一次请求页面时将其发回客户端;客户端拿到这个Nonce,将其与用户密码串联在一起并进行非可逆加密(MD5、SHA1等等),然后将这个加密后的字符串和用户名、Nonce、加密算法名称一起发回服务器;服务器使用接收到的用户名到数据库搜索密码,然后跟客户端使用同样的算法对其进行加密,接着将其与客户端提交上来的加密字符串进行比较,如果两个字符串一致就表示用户身份有效。这样就解决了用户密码明文被窃取的问题,攻击者就算知道了算法名和nonce也无法解密出密码。
每个nonce只能供一个用户使用一次,这样就可以防止攻击者使用重放攻击,因为该Http报文已经无效。可选的实现方式是把每一次请求的Nonce保存到数据库,客户端再一次提交请求时将请求头中得Nonce与数据库中得数据作比较,如果已存在该Nonce,则证明该请求有可能是恶意的。然而这种解决方案也有个问题,很有可能在两次正常的资源请求中,产生的随机数是一样的,这样就造成正常的请求也被当成了攻击,随着数据库中保存的随机数不断增多,这个问题就会变得很明显。所以,还需要加上另外一个参数Timestamp(时间戳)。
Timestamp是根据服务器当前时间生成的一个字符串,与nonce放在一起,可以表示服务器在某个时间点生成的随机数。这样就算生成的随机数相同,但因为它们生成的时间点不一样,所以也算有效的随机数。
问题又来了,随着用户访问的增加,数据库中保存的nonce/timestamp/username数据量会变得非常大。对于这个问题,可选的解决方案是对数据设定一个“过期时间”,比如说在数据库中保存超过一天的数据将会被清除。如果是这样的,攻击者可以等待一天后,再将拦截到的HTTP报文提交到服务器,这时候因为nonce/timestamp/username数据已被服务器清除,请求将会被认为是有效的。要解决这个问题,就需要给时间戳设置一个超时时间,比如说将时间戳与服务器当前时间比较,如果相差一天则认为该时间戳是无效的。
HTTP消息体的加密
很不幸的是,经过上面这些复杂的处理后,我们的数据传输仍然是不安全的。我们都知道,http报文是以明文的方式在网络中传输的,包括Basic认证、Digest认证、OAuth、NTLM等等验证这一些认证机制都只是对HTTP头的信息作保护,而对于Http消息体的数据却没有作加密。以新浪首页的登录为例,它的账号就是以明文的方式传送的,如下图所示:
这样的方式是很不安全的,用户名和密码完全以明文的方式提交了。同样是新浪的网站——新浪微博就在登录前作了加密过的,如下图所示:
加密的方法可以参考前面讲到的nonce+timestamp的方案。不过这只解决了登录的问题,在注册时就不能提交使用nonce和timestamp非可逆加密了,这个时候要使用非对称加密。在用户打开注册页时,服务器生成一个公钥/私钥对并将公钥返回给客户端,客户端使用该公钥将密码加密后提交到服务器,服务器使用私钥解密后再保存到数据库。非对称加密算法的特点是每一个公钥和私钥都是一一对应的,使用公钥加密后只有拥有私钥的人才能进行解密,所以攻击者截取到http报文也毫无用处。
当然,在条件允许的情况下,可以使用SSL来实现HTTP报文的加密,这种方案是在应用层和传输层中间添加一个SSL层,该层使用对称加密的方法将HTTP报文加密后再传递到传输层,如下图所示:
在这之前,客户端与服务器需要使用非对称加密的方法来协商用于对称加密的公钥,对称加密要求加密者和解密者拥有同一个密钥(即公钥)。当客户端首次访问页面时,需要生成一个公钥给服务器,而这个公钥不是不可以给第三方知道的(知道了这个公钥就可对数据进行解密了),所以需要服务器首先生成一个公钥/密钥对,并使用生成的公钥加密客户端生成的公钥(非对称加密),这一个过程与前面讲到的注册密码加密的方式类似。
正因为在正式数据传输之前需要在服务器跟客户端之间进行几轮的协商,所以HTTPS相比HTTP来说安全性会高些、而性能会差些。
转自:http://www.cnblogs.com/bestzrz/archive/2011/09/03/2164620.html
nonce和timestamp在Http安全协议中的作用的更多相关文章
- PBOC协议中对于所有电子存折/电子钱包应用的预处理
下图给出了PBOC协议中规定的对电子存折/电子钱包应用的所有交易类型共有的预处理流程 图1 1.1 插入卡片 终端应具有检测IC卡是否已经插入读卡器的功能.如果IC卡已经插入,终端将继续执行1.2的应 ...
- http协议中用于上传多个文件的 multipart 字段
大家好,我是许飞,微软拼音的开发实习生.在网络编程中,经常用到从服务器上“下载”一些数据,有时却要向服务器“上传”数据.曾在一个原型中使用了“multipart/form-data”格式向Web服务器 ...
- C#的HTTP协议中POST与GET的区别
引言 HTTP协议我想任何IT人士都耳熟能详了,大家都能说出个所以然来.但是如果我问你HTTP协议的请求方法有哪些?POST与GET的差异?GET或POST传送数据量的大小有限制吗?HTTP响应的状态 ...
- HTTP 协议中的 Content-Encoding 和 Transfer-Encoding(内容编码和传输编码)
转自:http://network.51cto.com/art/201509/491335.htm Transfer-Encoding,是一个 HTTP 头部字段,字面意思是「传输编码」.实际上,HT ...
- HTTP协议中状态码的应用
HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码. 所有状态码的第一个数字代表了响应的五种状态之一. Mark from 维基百科 消息 ...
- TCP 协议中MSS的理解
在介绍MSS之前我们必须要理解下面的几个重要的概念.MTU: Maxitum Transmission Unit 最大传输单元MSS: Maxitum Segment Size 最大分段大小PPPoE ...
- LWIP协议中tcp_seg结构相关指针的个人理解
我曾经写在新浪博客上面,后来复制到这,图片就不行了. 原文地址转载 LWIP协议中tcp_seg结构相关指针的个人理解(http://blog.sina.com.cn/s/blog_7e586985 ...
- HTTP协议中PUT/GET/POST/HEAD等介绍
HTTP协议中GET.POST和HEAD的介绍 GET: 请求指定的页面信息,并返回实体主体. HEAD: 只请求页面的首部. POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体 ...
- tcp协议中mss的理解
在介绍MSS之前我们必须要理解下面的几个重要的概念.<blockquote>MTU: Maxitum Transmission Unit 最大传输单元MSS: Maxitum Segmen ...
随机推荐
- js createElement
http://www.w3schools.com/js/js_htmldom_nodes.asp var child = document.getElementById("p1" ...
- poj 1062 昂贵的聘礼(最短路 dijk+枚举)
终于A 了,这题做着真麻烦 题目:http://poj.org/problem?id=1062 dijk 一般用于正权有向图 此题的关键在于等级限制的处理,最好的办法是采用枚举,即假设酋长等级为5,等 ...
- Missing artifact com.sun:tools:jar:1.5.0的解决方案
今天在用maven的时候遇到一个问题pom.xml提示Missing artifact com.sun:tools:jar:1.5.0 试过改eclipse的eclipse.ini文件,也试过在ecl ...
- vijosP1026毒药?解药?
hash. 怎么感觉叫状态压缩bfs比较合适呢? #include<cstdio> #include<algorithm> #include<cstring> us ...
- [.NET WebAPI系列01] WebAPI 简单例子
[源] 来自微软WebAPI官方视频,Introduction to the ASP.NET Web API --Uniform Interface -- Demo-Using convention ...
- I.MX6 wm8962 0-001a: DC servo timed out
/******************************************************************************* * I.MX6 wm8962 0-00 ...
- UVALive 3211 Now or later(2-SAT,二分,Kosaraju)
题意: 有n个飞机要降落,每机都可以在两个时间点上选择降落.但是两机的降落时间间隔太小会影响安全性,所以,要求两机的降落时间应该达到最大,当然也不能冲突了.问最大的时间间隔是多少?(其实问的是max( ...
- Deployed component GUIs and figures have different look and feel than MATLAB desktop
原文:http://www.mathworks.com/support/bugreports/1293244 Description Deployed GUIs and figures look an ...
- SpannableStringBuilder 和 SpannableString
EditText: 通常用于显示文字,但有时候也需要在文字中夹杂一些图片,比如QQ中就可以使用表情图片,又比如需要的文字高亮显示等等,如何在android中也做到这样呢? 记得andr ...
- 教你用Java安全有效的实现两星期内自动登陆功能-Session
现在很多网站都有为用户保存登陆信息(即保存Cookie)的功能,当用户下一次进入网站时,可以帮助用户自动登陆,使网站显得更加友好.笔者通过研究ACEGI项目的自动登陆源码,编写了一个安全有效的实现两星 ...