http://www.byywee.com/page/M0/S591/591082.html 写道
前段时间给客户网站做新浪微博账号登录功能,对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来说安全性会高些、而性能会差些。
分享到:
相关推荐
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验证是确保通信双方身份合法性的过程,防止中间人攻击和其他安全风险。这里,...
1. 获取请求头中的参数:`timestamp`(时间戳)、`nonce`(随机数)和`signature`(签名)。如果这些参数缺失,将抛出`SecurityException`。 2. 验证时间戳的有效性:将时间戳转换为毫秒,然后判断当前时间与时间戳...
OAuth是一个非常重要的协议,特别是在社交网络、云计算和其他需要安全授权的应用场景中。它不仅简化了用户授权的过程,还极大地提升了安全性。对于任何涉及用户数据共享的应用来说,理解和实施OAuth都是至关重要的。
2. **Nonce 和 Timestamp**:每次请求都应包含一个唯一的随机数(Nonce)和时间戳(Timestamp),这有助于防止重放攻击。 3. **安全传输**:推荐使用 HTTPS 进行数据传输,以确保数据在传输过程中的安全性和完整性。...
OAuth 授权协议是目前最流行的身份认证标准之一,它提供了一个安全、开放、简易的标准,允许第三方应用程序访问用户资源。以下是 OAuth 授权协议的 Java 实现详解。 OAuth 授权协议的原理 OAuth 授权协议的流程...
- **请求参数**:每个请求必须包含Action(接口名称)、Version(API版本)、AccessKeyId(阿里云颁发的密钥ID)等公共参数,还需要Timestamp(UTC时间戳)和Signature(签名)以保证请求的安全性。 7. **签名机制...
签名的规则涉及到几个参数:Appid(平安颁发的应用ID)、Openid(用户的ID)、Openkey(一次性认证凭证)、Timestamp(时间戳)、Nonce(随机数)以及双方约定的sha1密钥。这些参数按照一定规则排序并组合成字符串,...
Nonce值(一次性随机数)在安全验证场景中非常常见,例如在OAuth协议中。下面展示了如何生成一个Nonce值: ```objective-c - (NSString *)generateNonce { CFUUIDRef theUUID = CFUUIDCreate(NULL); CFStringRef ...
它遵循OAuth协议,确保应用在获取和使用用户信息时的安全性。授权过程包括三个主要步骤: 1. **请求_token**:应用首先向`https://open.t.qq.com/cgi-bin/request_token`发起GET请求,带上必要的参数如`oauth_...
这个类将负责检查请求头中是否包含时间戳(timestamp)、随机数(nonce)和签名(signature)。如果缺少这些字段中的任何一个,系统将抛出一个安全性异常。 接下来,要验证时间戳是否在有效的时间范围内。时间戳...
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等参数,进行相应的解密与校验工作,以确保收到的是正确的企业微信服务器发送的请求。 四、消息加解密与校验 开发者需要实现消息的加解密与校验机制,以...