OAuth协议在现在有很多应用,比较感兴趣,学习下;详细见
OAuth官网。
- OAuth简介:
OAuth定义了三个角色:client/server/resource owner.就传统认证方式而言,是client-server一对一的认证方式,client和resource owner几乎是对等的地位,client要获得server的认证必须知道resource owner的全部信息,例如:username/password,一旦client获得server的认证,这样资源拥有者无法限制client的权限了。但是,如果出现了以下情况:A是资源拥有者,A将资源授予C,而B需要访问该资源,但是A又不愿意让B知道A和C之间的认证方式,那么如何实现这种三方认证呢。
OAuth是对第三方访问resource owner的资源的一个权限保护,用于HTTP(S)协议资源访问。
- OAuth认证过程简介:
2-Legged, 3-Legged, n-Legged,;)这个就不解释了。 OAuth使用三种类型证书:client credentials, temporary credentials, and token credentials. client credentials: consumer key and consumer secret temporary credentials: request token and secret token credentials: access token and secret
这里以dropbox为例,假设A dropbox user/B dropbox第三方应用/C dropbox server.A需要用B去访问自己存在C上的资源,但B不应该知道A的用户名和密码。 首先,B会拿到C给的一个consumer key和consumer secret;B请求C一个request token。 接着,B会用这个request token重定向A到C提供的一个URL去认证身份。A通过C的认证后,会被告知B发出一个访问请求,需要允许或者禁止。如果允许,C将此认证后的request token通知B,B用它交换得到access token,这是访问A在C上资源的令牌。 这样,B就可以不用知道A和C之间的令牌,而获取到A在C上的资源访问权限了。
OAuth的精妙之处在于在HTTP这样一个不安全的通信环境下保证了通信的安全性。并能够防止man-in-the-middle attack (MITM),eavesdropping等等,基于HMAC-SHA1/RSA-SHA1。OAuth协议是一种authorization delegation protocol(认证-授权)。
- OAuth与普通认证方式的差异:
最通常的认证方式是username/password认证,而对于OAuth这种可以提供多方认证就不能简单的依赖于传统的这种方式了,它主要依赖于consumer key(secret)/token key(secret)。令牌取代了实际的用户名和密码,而使得第三方不需要知道实际的用户名和密码。
OAuth中有两种令牌:request token/access token。两个通道:front-channel(用于User进行请求认证)/back-channel(client/server信息交换)。
- OAuth的数据完整性和可认证性:
OAuth利用HASH算法保证了传输数据的完整性,再加入双方共享的秘密信息作为信息来源的可认证。能够有效的防止数据的伪造和篡改,详见HMAC-SHA1
base64 with sha-1 import binascii import hashlib binascii.b2a_base64(hashlib.sha1('test').digest()) base64 with HMAC-SHA1 import hmac import hashlib import binascii bin = hmac.new('baron', 'test', hashlib.sha1) binascii.b2a_base64(bin.digest())
- RSA-SHA1在OAuth中的应用:
consumer用私钥对请求信息签名,server用公钥验证请求,在这里私钥的安全性是整个RSA-SHA1安全性的唯一保证。
- 时间戳Timestamp:
为了抵御重放攻击,OAuth利用nonce(我比较喜欢seed这个词)和时间戳,nonce和信息一起被签名的,防止被篡改。
总的来看,OAuth同时运用了对称加密,非对称加密,数字签名等来保障认证的安全性。
No comments :
Post a Comment