RESTful API是基于HTTP协议的API(Application Programming Interface),它的核心是将所有的API都理解为一个网络资源,客户端请求资源时操作的是资源的表述而不是资源本身,每条请求都应包含足够的信息来让服务器知道如何处理该消息,即将所有的客户端和服务器的状态转移封装到HTTP请求的Method之中,它拥有Url唯一资源对应的特性。
由于RESTful Api是基于HTTP协议的API,并且是无状态传输,意味着服务器不会保存客户端的状态,每一次的调用和上一次调用请求是完全无关的,而且在如今的云计算厂商广泛的搭SaaS(Software-as-a-service)平台,将云计算和移动应用相结合,可以随时地交付和使用软件服务,通过对外部用户暴露一定开放性的RESTful API来实现交互,所以如今针对RESTful API通信的攻击手段也越来越多,如通过中间人攻击方式给系统造成重大安全隐患。正是由于这种原因RESTful架构的web系统需要在API接口调用上做好安全防护,防止出现API重放攻击,所以身份认证是RESTful API的关键问题。
目前常见的身份认证方法有如下几种:
-
HTTP Basic Authentication(HTTP基本认证):当访问一个需要这种方式的URL的时候,通常需要在请求头中添加加BASE64编码后的用户名和密码字符串当作认证信息或者直接在url添加BASE64编码后的用户名和密码字符串,服务器收到请求包后会对用户名密码进行解密并验证正确性,认证成功则认证信息会保存在session中,在session有效期内就不用再认证了。如果没有通过验证,服务器会返回“401 Unauthorized”状态码到客户端。
-
HTTP Digest Authentication(HTTP摘要认证):这种方式是HTTP Basic Authentication的改进版本,它采用摘要代替密码的传输,并且采用MD5之类的不可逆哈希算法对密码加密。为了防止重放攻击,客户端第一次请求时,通过服务端生成的随机数将这个随机数放在WWW-Authenticate响应头发送回客户端,每次计算摘要时先将这个随机数附加到摘要中。服务器拿到摘要后根据客户端的ID信息,从数据库取出客户端密码进行同样的计算得出的摘要进行对比,匹配则身份验证通过。
-
Access Token(访问令牌):客户端登陆完成之后,服务端会生成一个有时效性的token返回给客户端,以后每次请求客户端都需要带上token,即当作URL参数发送,如“http://demo.com/users?access-token=xxxxxx”,服务端以此来控制身份,当token过期后,服务端会销毁token,客户端需要重新请求获得token。
-
OAuth(开放授权):OAuth协议是一个授权的开放网络标准,目前版本是2.0。OAuth通过在客户端和服务器之间设置一个授权服务器,当客户端请求服务器资源时,服务器将客户端请求重定向到授权服务器,客户端通过登录授权服务器获取授权的Token,然后通过HTTP Bearer Tokens发送到资源服务器完成认证。现在的OAuth 2.0版本基于https协议,要求强制使用https协议。
常用到的几个概念:
重放攻击:
攻击者通过一系列办法窃取到了认证凭证,模仿用户来达到欺骗服务器的目的。
时间戳:
能用来唯一地标识某一刻的时间。可用来验证客户端和服务器之间传递时间消耗。如客户端发起的请求带上了时间戳,服务端收到后发现接受时间和发送时间相差60s,就可以拒绝请求。时间戳没有时区性,所以不用考虑客户端、服务器之间时区不一致问题。
签名:
使用哈希算法加密用户请求过程中的一些参数生成的不可逆密文,服务端接收到签名后用相同的流程生成签名进行认证。签名过程种可以通过随机数、时间戳来保证签名的一次性。
sign = BASE64(MD5(privatekey, HttpMethod, nonce, URIPath, parameters)));
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/132479.html