网络空间安全技术
上QQ阅读APP看书,第一时间看更新

5.4 REST API常见认证方式

表述性状态传递(Representational State Transfer,REST)是一套新兴的Web通信协议,访问方式和普通的HTTP类似,平台接口分GET和POST两种请求方式。REST接口为第三方应用提供了简单易用的API调用服务,第三方开发者可以快速、高效、低成本地集成平台API。REST API常见的认证方式有HTTP Digest、API Key、OAuth2、HMAC和JWT(参见5.2.5节)等。

5.4.1 HTTP Digest

摘要认证(Digest Authentication)是服务器端以nonce(响应中包含信息)进行质询,客户端以用户名、密码、nonce、HTTP方法和请求的URI等信息为基础产生的response(响应)信息进行认证的方式。

摘要认证的步骤如下。

1)客户端访问一个受HTTP摘要认证保护的资源。

2)服务器返回401状态及nonce等信息,要求客户端进行认证。

3)客户端将以用户名、密码、nonce值、HTTP方法和被请求的URI为基础而加密(默认为MD5算法)的摘要信息返回给服务器。

认证必须的五个情报:

● realm:响应中包含信息。

● nonce:响应中包含信息。

● username:用户名。

● digest-uri:请求的URI。

● response:以上面4个信息加密码信息,使用MD5算法得出的字符串。

4)如果认证成功,则返回相应的资源;如果认证失败,则仍返回401状态,要求重新进行认证。

注意事项如下。

● 避免将密码作为明文在网络上传递,相对提高了HTTP认证的安全性。

● 当用户为某个realm首次设置密码时,服务器保存的是以用户名、realm和密码为基础计算出的哈希值(ha1),而非密码本身。

● 如果qop=auth-int,在计算ha2时,除了包括HTTP方法、URI路径外,还包括请求实体、主体,从而防止PUT和POST请求被人篡改。

● 因为nonce本身可以被用来进行摘要认证,所以也无法确保认证后传递过来的数据的安全性。

5.4.2 API KEY

API KEY非常适合开发人员快速入门。一般会分配app_key、sign_key两个值。将通知所有参数,按参数名1参数值1…参数名n参数值n的方式进行连接,得到一个字符串,然后在此字符串前添加通知验证密钥(sign_key,不同于app_key),计算ha1值,转成小写。

比如,请求的参数为:

通常,API KEY可以完全访问API可以执行的每个操作,包括写入新数据或删除现有数据。如果在多个应用中使用相同的API密钥,则被破坏的应用可能会损坏用户的数据,而无法轻松停止该应用。有些应用程序允许用户生成新的API密钥,甚至可以有多个API密钥,可以选择撤销API密钥。更改API密钥的能力提高了安全性。

注意:许多API密钥作为URL的一部分在查询字符串中发送,这使得很容易被其他人发现。更好的选择是将API密钥放在Authorization标头中,即Authorization:Apikey 1234567890abcdef。

5.4.3 OAuth2

OAuth是使用API访问用户数据的更好方式。与API密钥不同,OAuth不需要用户通过开发人员门户进行探索。事实上,在最好的情况下,用户只需单击一个按钮即可让应用程序访问其账户。OAuth,特别是OAuth2,是幕后流程的标准,用于确保安全处理这些权限。

最常见的OAuth实现使用这些令牌中的一个或两个。

● 访问令牌:像API密钥一样发送,它允许应用程序访问用户的数据;访问令牌可以到期。

● 刷新令牌:是OAuth流的一部分,刷新令牌如果已过期则检索新的访问令牌。

与API密钥类似,可以在很多地方找到OAuth访问令牌,如查询字符串、标题和其他位置。由于访问令牌就像一种特殊类型的API密钥,因此最有可能放置在授权头,如下所示:

访问和刷新令牌不应与客户端ID和客户端密钥混淆。这些值可能看起来像一个类似的随机字符集,用于协商访问和刷新令牌。

与API密钥一样,任何拥有访问令牌的人都可能会调用有害操作,如删除数据。但是,OAuth对API密钥提供了一些改进。对于初学者来说,访问令牌可以绑定到特定的范围,这限制了应用程序可以访问的操作类型和数据。此外,与刷新令牌相结合,曾使用过的访问令牌将会过期,因此旧访问令牌被泄露所产生的负面影响有限。最后,即使不使用刷新令牌,仍然可以撤销访问令牌。

5.4.4 HMAC

HMAC运算利用哈希算法,以一个密钥和一个消息作为输入,生成一个消息摘要作为输出。

HMAC的认证流程如下。

1)由客户端向服务器发出一个验证请求。

2)服务器接收到此请求后,生成一个随机数并通过网络传输给客户端(此为质询)。

3)客户端将收到的随机数提供给ePass,ePass使用该随机数与存储在ePass中的密钥进行HMAC-MD5运算,并得到一个结果作为认证证据传给服务器(此为响应)。

4)与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户。

由上面的介绍可以看出,HMAC算法更像是一种加密算法,它引入了密钥,其安全性已经不完全依赖于所使用的HASH算法,其安全性体现在以下几点。

● 使用的密钥是双方事先约定的,第三方不可能知道。

● 作为非法截获信息的第三方,能够得到的信息只有作为“挑战”的随机数和作为“响应”的HMAC结果,无法根据这两个数据推算出密钥。

● 由于不知道密钥,所以无法仿造出一致的响应。

大多数的语言都实现了HMAC算法,比如PHP的mhash、Python的hmac.py和Java的MessageDigest类,在Web验证中使用HMAC也是可行的,用JS进行MD5运算的速度也比较快。