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来说安全性会高些、而性能会差些。
分享到:
相关推荐
4. **签名(Signature)**:通过特定算法(如HMAC-SHA256)结合AppSecret、Nonce和Timestamp生成,用于验证消息的完整性和来源的合法性。 5. **XML格式**:微信的消息交互通常采用XML格式,包含消息类型、内容、加...
请注意,由于OAuth 1.0的安全性要求,每次请求的nonce和timestamp都必须是唯一的,因此在实际操作中,nonce和timestamp的生成应在每次请求时动态进行。 总结来说,实现JMeter中的OAuth 1.0认证需要对OAuth协议有...
在微信企业号开发中,回调模式(Callback Mode)是实现业务逻辑的重要环节,它涉及到微信服务器与企业号应用之间的通信安全。回调模式URL验证是确保通信双方身份合法性的过程,防止中间人攻击和其他安全风险。这里,...
OAuth是一个非常重要的协议,特别是在社交网络、云计算和其他需要安全授权的应用场景中。它不仅简化了用户授权的过程,还极大地提升了安全性。对于任何涉及用户数据共享的应用来说,理解和实施OAuth都是至关重要的。
1. 获取请求头中的参数:`timestamp`(时间戳)、`nonce`(随机数)和`signature`(签名)。如果这些参数缺失,将抛出`SecurityException`。 2. 验证时间戳的有效性:将时间戳转换为毫秒,然后判断当前时间与时间戳...
OAuth 授权协议是目前最流行的身份认证标准之一,它提供了一个安全、开放、简易的标准,允许第三方应用程序访问用户资源。以下是 OAuth 授权协议的 Java 实现详解。 OAuth 授权协议的原理 OAuth 授权协议的流程...
2. **Nonce 和 Timestamp**:每次请求都应包含一个唯一的随机数(Nonce)和时间戳(Timestamp),这有助于防止重放攻击。 3. **安全传输**:推荐使用 HTTPS 进行数据传输,以确保数据在传输过程中的安全性和完整性。...
- **请求参数**:每个请求必须包含Action(接口名称)、Version(API版本)、AccessKeyId(阿里云颁发的密钥ID)等公共参数,还需要Timestamp(UTC时间戳)和Signature(签名)以保证请求的安全性。 7. **签名机制...
Nonce值(一次性随机数)在安全验证场景中非常常见,例如在OAuth协议中。下面展示了如何生成一个Nonce值: ```objective-c - (NSString *)generateNonce { CFUUIDRef theUUID = CFUUIDCreate(NULL); CFStringRef ...
签名的规则涉及到几个参数:Appid(平安颁发的应用ID)、Openid(用户的ID)、Openkey(一次性认证凭证)、Timestamp(时间戳)、Nonce(随机数)以及双方约定的sha1密钥。这些参数按照一定规则排序并组合成字符串,...
这个类将负责检查请求头中是否包含时间戳(timestamp)、随机数(nonce)和签名(signature)。如果缺少这些字段中的任何一个,系统将抛出一个安全性异常。 接下来,要验证时间戳是否在有效的时间范围内。时间戳...
它遵循OAuth协议,确保应用在获取和使用用户信息时的安全性。授权过程包括三个主要步骤: 1. **请求_token**:应用首先向`https://open.t.qq.com/cgi-bin/request_token`发起GET请求,带上必要的参数如`oauth_...
Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。
这个方法通常会检查`signature`、`timestamp`和`nonce`三个参数,使用固定的`TOKEN`(在后台设置的字符串)进行签名计算,并与微信提供的签名进行对比。如果签名匹配,则返回`echostr`参数,表示验证成功。 ```php...
该接口规范明确了互联网医疗服务监管平台与合作伙伴之间数据交互的具体流程和技术细节,确保了数据的安全传输与合规使用。通过遵循这些规范,可以有效提升数据处理效率,保障医疗服务的质量与安全性。对于具体应用...
开发者需要根据请求中提供的msg_signature、timestamp、nonce等参数,进行相应的解密与校验工作,以确保收到的是正确的企业微信服务器发送的请求。 四、消息加解密与校验 开发者需要实现消息的加解密与校验机制,以...