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、 客户端提交的用户名和密码只经过简单的编码,攻击者只要wiretap到该数据包,便可很容易的将其反编码为原始用户名和密码。
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来说安全性会高些、而性能会差些。
分享到:
相关推荐
csdn的x-ca-nonce和x-ca-signature算法实例 csdn的接口都要传x-ca-nonce和x-ca-signature 根据请求接口url计算
主要介绍了PHP基于timestamp和nonce实现的防止重放攻击方案,简单讲述了重放攻击相关原理并结合实例形式分析了php使用timestamp和nonce实现的防止重放攻击相关操作技巧,需要的朋友可以参考下
当我们填好配置信息后微信服务器发起一个GET请求到我们在公众平台配置的服务器url地址,微信方将带上signature,timestamp,nonce,echostr四个参数,我们自己服务器通过拼接公众平台配置的token,以及传上来的...
Laravel开发-laravel-nonce 这是一个用于在请求中集成Laravel中的nonce的包
这是Mathy Vanhoef关于破解wifi加密协议WPA/WPA2使用的密钥重安装攻击方法的论文Key Reinstallation Atacks Forcing Nonce Reuse in WPA2的翻译
Node.js Nonce 轻松地对您的Web表单和端点进行身份验证,并对您的操作进行标记以防止CSRF。 npm install node-nonce --save const nonce = require ( 'node-nonce' ) . config ( { secret : 'eiwer9weriorl2342i323i...
远程用户认证方案是远程服务器通过不安全的网络认证远程用户身份的一种机制...为了克服这些缺点,提出了基于双线性对和Nonce的智能卡远程用户认证方案。安全分析表明,该方案不但增强了认证系统的安全性,而且可安全地完
OS X 的一个小工具,用于查找连接的 iOS 设备的 nonce 和 ECID。 建造 xcrun -sdk macosx clang -arch x86_64 -F/System/Library/PrivateFrameworks -framework CoreFoundation -framework MobileDevice nonce.c -o ...
Nonce是一个安全的登录系统,该系统使用在连接时分配给客户端的唯一(针对每个会话)ID。 然后,客户端对输入的登录名进行哈希处理,添加唯一ID,然后再次重新哈希。 然后,此新的密码和安全密钥的哈希组合将发送到...
NonceUtil-C# 微型C#NONCE生成器,具有可变的超时时间和单独的盐,无需数据库。 灵感来自 有关NONCE用例的更多信息,请参见 。用法生成一分钟寿命的NONCE: var nonce = NonceUtil.GenerateNonce("myNonceSecret",...
您只需调用Csp::sendHeader()和Csp::getNonce() 。 Csp::sendHeader()发送CSP标头。 Csp::getNonce()返回随机数值。 <?php require __DIR__ . '/bootstrap.php' ; Csp :: sendHeader (); ?> <!DOCTYPE ...
X-Ca-Key、X-Ca-Nonce、X-Ca-Signature 和 X-Ca-Key、X-Ca-Nonce、X-Ca-Signature 和 X-Ca-Signature-Headers 是一组用于进行身份验证和安全保护的 HTTP 请求头。 根据固定算法生成 X-Ca-Nonce,这个值跟其他参数的...
1996年,Lowe首先使用...但是类似FDR的模型检测通常受Nonce、Key等新鲜值大小的限制,而在实际执行中所需的数据值比这大得多。使用数据独立技术使结点能够调用无限的新鲜值以保证实例无限序列的运行。本文将研究Rosc
适用于JSP / Servlet引擎的HTTP安全标头和内容安全策略插件 Thix是JSP / Servlet引擎的插件,用于动态添加HTTP安全标头(实际上是任何标头-我也将其用于缓存标头)以及建立内容安全策略(CSP)。 主要特征 规则基于...
节点现值 生成具有指定长度的随机字母数字字符串。 安装 npm install @rdcl/nonce ...const nonce = require ( '@rdcl/nonce' ) nonce ( 27 ) . then ( function ( nonce ) { // ... } ) 测验 npm test
checkm8-nonce-setter 用于与checkm8兼容的设备的随机数设置器iOS版本无关紧要。 如果您的设备与checkm8 + Linus Henze的Signature Check Remover兼容,则可以设置随机数并降级。 该脚本仅适用于macOS。 指示 - "./...
笔记 项目已退役且未在积极开发中。 nonce-golang 一次性令牌库 适用于 Google Go 1.x 版
Dim ArrTmp() As String = {Token, timestamp, nonce} Array.Sort(ArrTmp) ' WriteLog("signature" & ":" & signature) ' WriteLog("timestamp" & ":" & timestamp) ' WriteLog("nonce" & ":" & nonce) Dim ...
csdn中x-ca-key,x-ca-nonce,x-ca-signature与x-ca-signature-headers探索,包含结论,源码js分析,Java版代码实现,其他语言实现可参考Java代码实现,其实只要看明白开头的结论啥语言都一样