Browse Month: 八月 2016

SSL/TLS协议

TLS是SSL的升级版

SSL/TLS的作用

未使用SSL/TLS的HTTP

  1. 窃听风险(eavesdropping):第三方可以获知通信内容。
  2. 篡改风险(tampering):第三方可以修改通信内容。
  3. 冒充风险(pretending):第三方可以冒充他人身份参与通信。

SSL/TLS作用

  1. 所有信息都是加密传播,第三方无法窃听。
  2. 具有校验机制,一旦被篡改,通信双方会立刻发现。
  3. 配备身份证书,防止身份被冒充。

基本运行过程

  1. 客户端向服务器端索要公钥,公钥放在证书中
  2. 客户端用公钥加密信息
  3. 服务器收到密文后用私钥解密

公钥加密计算量太大问题解决

每一次对话(session),客户端和服务器端都生成一个”对话密钥”(session key),用它来加密信息。
由于”对话密钥”是对称加密,所以运算速度非常快,而服务器公钥只用于加密”对话密钥”本身,这样就减少了加密运算的消耗时间。

最终流程

  1. 客户端向服务器端索要并验证公钥。
  2. 双方协商生成”对话密钥”。
  3. 双方采用”对话密钥”进行加密通信。

握手详细过程

客户端请求(ClientHello)

  1. 支持的协议版本,比如TLS 1.0版。
  2. 一个客户端生成的随机数,稍后用于生成”对话密钥”。
  3. 支持的加密方法,比如RSA公钥加密。
  4. 支持的压缩方法

注意:TLS加入Server Name Indication,方便虚拟主机

服务端相应(ServerHello)

  1. 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
  2. 一个服务器生成的随机数,稍后用于生成”对话密钥”。
  3. 确认使用的加密方法,比如RSA公钥加密。
  4. 服务器证书。

注意:服务器可能要求客户端提供“客户端证书”,如金融机构的USB秘钥

客户端回应

客户端验证证书

  1. 一个随机数。该随机数用服务器公钥加密,防止被窃听。
  2. 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
  3. 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。

服务器回应

服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的”会话密钥”

  1. 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
  2. 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验

参考

OAuth2.0 概念和使用

OAuth 是什么

OAuth (Open Authorization) 是一个用于授权的开放网络标准。常用于第三方应用登录或者授权第三方应用访问服务器资源,例如很多APP 或网站会接入微信登录。

应用场景

授权登录场景

imooc 用于第三方登录,一般APP 或者网站上都有微信登录或者支付宝登录。

授权使用资源场景

百度授权

http://developer.baidu.com/wiki/index.php?title=docs/oauth/rest/file_data_apis_list

微信账户登录过程

下面以微信登录慕课网站为例了解OAuth 工作流程

工作原理

OAuth 名词

在详细讲解OAuth 2.0之前,需要了解几个专用名词。它们对读懂后面的讲解,尤其是几张图,至关重要。

(1) Third-party application:第三方应用程序,本文中又称”客户端”(client),即上一节例子中的”云冲印”。

(2)HTTP service:HTTP服务提供商,本文中简称”服务提供商”,即上一节例子中的Google。

(3)Resource Owner:资源所有者,本文中又称”用户”(user)。

(4)User Agent:用户代理,本文中就是指浏览器。

(5)Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。

(6)Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。

OAuth 授权过程

OAuth 2.0的运行流程如下图,摘自RFC 6749。

OAuth运行流程

(A)用户打开客户端以后,客户端要求用户给予授权。

(B)用户同意给予客户端授权。

(C)客户端使用上一步获得的授权,向认证服务器申请令牌。

(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。

(E)客户端使用令牌,向资源服务器申请获取资源。

(F)资源服务器确认令牌无误,同意向客户端开放资源。

不难看出来,上面六个步骤之中,B是关键,即用户怎样才能给于客户端授权。有了这个授权以后,客户端就可以获取令牌,进而凭令牌获取资源。

实现有3个主要步骤

第一步: 请求OAuth 登录页 获取 Request Token

Request Token URL – 未授权的令牌请求服务地址

请求登录页面时带有特定参数的 URL

第二步:用户使用账户登录并授权

redirect_uri 跳转会指定回调地址,并获取 code

第三部:获取 Access Token

User Authorization URL 用户授权的令牌请求服务地址

用户授权之后需要请求的一个带有特定参数的 URL

第四步:以 AccessToken 进行后续 API访问

AccessToken 过期刷新

Refresh Token 刷新 Access Token

User Authorization URL 请求中添加refersh token 参数

历史演进与安全问题

CSRF 攻击

  • 2007 OAuth1.0
  • 2010 OAuth2.0

参考

wiki
https://oauth.net/2/
https://en.wikipedia.org/wiki/OAuth
http://download.csdn.net/download/samxx8/8858103

rfc

https://tools.ietf.org/html/rfc6749

weixin

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316518&token=&lang=zh_CN