文章目录
  1. 1. 如何使用基于身份验证来验证客户端
  2. 2. 如何使用摘要身份验证来验证客户端
  3. 3. 如何使用三方OAuth
  4. 4. 如何使用两方OAuth
  5. 5. 如何处理URI中的敏感信息
  6. 6. 如何维护表述的机密性与完整性

一个基于Web的应用系统安全可能需要:

  1. 确保仅认证过的用户访问资源。
  2. 确保信息从采集到存储及之后展现给授权实体或用户过程中信息的可靠性和完整性。
  3. 防止未授权或恶意客户端滥用资源和数据。
  4. 维持私密性并符合当地安全法规。

本章将讨论RESTful Web服务安全相关话题的一个子集,将其中一些话题映射到已有的基于HTTP的标准和实践上,例如身份验证,授权,机密性和完整性。

如何使用基于身份验证来验证客户端

认证协议,如基本认证和摘要认证,使用一种质询-应答机制的协议。当客户端访问受限资源,服务器使用WWW-Authenticate头质询客户端请求其应答,应答是客户端和服务器之间共享的密钥功能。认证可用于两类场景:客户端代表自己访问受限资源、客户端代表用户访问受限资源。

基本认证(RFC 2617)中客户端会通过标识符和共享密钥来向服务器认证请求。当服务器收到客户端访问受限资源的请求,返回状态码401 (Authorization Required)及WWW-Authenticate头,WWW-Authenticate:Basic realm=”some name”。客户端会将客户端标识符(例如用户名)和共享密钥(例如密码)连接成<idetifier>:<secret>并通过Base64编码到Authorization头,Authorization: Basic 。服务器会对文本进行解码并验证密钥是否一致。如果客户端提前知道服务器对某资源需要基本认证,可以在请求中加入Authorization头以免收到401 (Unauthorized)状态码及WWW-Authoricate头。服务器文档可包含认证需求以帮助客户端开发人员了解这些信息。

如何使用摘要身份验证来验证客户端

摘要认证(RFC 2617)同基本认证类似,客户端向服务器发送的是证书摘要而不是共享密钥。摘要认证也提供了防止重放攻击的机制。当服务器收到客户端访问受限资源的请求,返回状态码401 (Authorization Required)及WWW-Authenticate头,摘要认证方案、必要的realm和nonce指令及其他指令。nonce是仅一次或有限次数使用的数字或token。客户端会将客户端或用户标识符摘要、realm和共享密钥放入到Authorization头。服务器会将请求中的摘要与存储在服务器的证书摘要验证,并在响应中包含Authentication-Info头(Authorization头在服务器侧的等同体)。默认客户端使用MD5计算摘要,不同于基本认证,这种技术不会交换未加密的共享密钥。

# Request 
GET /photos HTTP/1.1  
Host: www.example.org 
# Response 
401 Unauthorized 
WWW-Authenticate: Digest realm="Sample app", nonce="6cf093043215da528d7b5039ed4694d3", 
      qop="auth"  
Content-Type: application/xml;charset=UTF-8 

  Unauthorized. 

# Request 
GET /photos HTTP/1.1 
Host: www.example.org 
Authorization: Digest username="photoapp.001", realm="Sample app", 
12.2  How to Use Digest Authentication to Authenticate Clients | 221 
      nonce="6cf093043215da528d7b5039ed4694d3", 
      uri="/photos", response="89fba5bf5e5f9dd69865258c21860956", 
      cnonce="c019e396409afe784ae9f203b8dfdf7e", nc=00000001, qop="auth"  
# Response 
HTTP/1.1 200 OK 
Content-Type: application/xml;charset-UTF8 
...

如何使用三方OAuth

OAuth(http://oauth.net)是2007年开发的一种代理认证协议。使用该协议,用户可以不用泄漏自己的证书,让客户端访问其在服务器上的数据。OAuth认证协议由于协议中包含三种角色,所以称为三方认证:服务提供者(例如服务器)、OAuth消费者(例如客户端)和用户。

OAuth依赖服务器向客户端发布的三套令牌和密钥。

  1. 消费者键值和消费者密钥:消费者键值是客户端的唯一标识符。客户端使用消费者密钥签署获得请求令牌的请求。
  2. 请求令牌和令牌密钥:请求令牌是服务器发布的一次性临时标识符,用于请求用户向客户端授予权限。令牌密钥是用于签署获得访问令牌的请求。
  3. 访问令牌和令牌密钥:访问令牌是客户端用于访问用户资源的标识符。拥有访问令牌的客户端能在令牌有效时访问用户资源。服务器可以由于令牌到期或用户撤销权限而随时撤销访问令牌。令牌密钥用于签署访问受限用户资源的请求。

使用三方OAuth涉及以下步骤以获得访问令牌和密钥。服务器可能会授予对特定用户资源一段时间或一定访问次数的访问令牌。

  1. 客户端向服务器请求消费者键值和消费者密钥。
  2. 客户端使用消费者键值获得请求令牌和密钥。
  3. 客户端重定向用户到服务器获得让客户端访问用户资源的权限,该过程产生认证过的请求令牌。
  4. 客户端请求服务器提供访问令牌和密钥。
  5. 当客户端发送请求访问受限资源时,客户端请求包含Authorization头(或查询参数),其含有消费者键值、访问令牌、签名方法和签名、时戳、nonce和可选的OAuth协议版本号。

由于OAuth是HTTP层之上的协议,服务器文档应该提供:获得请求令牌的URI、鉴权服务器的URI和获得访问令牌的URI。OAuth建议使用POST获得请求和访问令牌。

如何使用两方OAuth

两方OAuth与客户端通过使用基本或摘要认证的Authorization头向服务器提供认证相类似,没有引入代理。注意OAuth协议没有指定这种认证方式,但是被广泛用于客户端与服务器之间的认证。

使用两方OAuth涉及以下步骤:

  1. 客户端提前向服务器请求消费者键值和消费者密钥。消费者键值是客户端的标识符。消费者密钥是客户端和服务器之间共享的密钥。
  2. 当客户端发送请求访问受限资源时,客户端请求包含Authorization头,其含有消费者键值、访问令牌、签名方法和签名、时戳、nonce和可选的OAuth协议版本号。
  3. 服务器在授予资源访问权限之前验证签名。

如何处理URI中的敏感信息

服务器可能将应用程序状态编码到URI。在有些情况下,这些状态可能是敏感的。当URI被通过网络传输时使用TLS有助于状态的完整性,但是服务器无法控制客户端如何管理URI。在这种情况下,服务器需要确保URI不会被篡改且URI中的消息是可靠的。为了检测URI篡改,使用HMAC-SHA1和RSA-SHA1之类的机制对URI的数据计算摘要签名,将签名作为查询参数加入资源URI中。如果URI中数据是机密的,使用AES、Blowfish、DES、Triple DES、Serpent、Twofish等机制加密数据。确保在将其加入到URI之前使用对加密结果Base64进行编码。

如何维护表述的机密性与完整性

为了维持资源表述的可靠性和完整性,使用TLS,仅基于HTTPS的请求可以访问服务器受限资源

文章目录
  1. 1. 如何使用基于身份验证来验证客户端
  2. 2. 如何使用摘要身份验证来验证客户端
  3. 3. 如何使用三方OAuth
  4. 4. 如何使用两方OAuth
  5. 5. 如何处理URI中的敏感信息
  6. 6. 如何维护表述的机密性与完整性