Web API:基本身份验证还是基于SSL的HMAC?

时间:2014-04-03 15:39:06

标签: asp.net rest authentication ssl asp.net-web-api

我想保护.NET Web API服务。我将使用SSL,但我还需要限制每个用户可以调用的Web API调用,具体取决于用户的权限。

从我读过的内容来看,REST / HTTP应该是无状态的,所以从技术上讲,你不应该能够维持任何会话状态,但周围有some ways

一个是使用basic authentication。凭据随每个请求一起发送。虽然这可能是安全的,因为它们无论如何都是通过SSL传输的,但实际上它并不实际,因为每次都需要大量的开销来重新验证数据库。 (可能是将它们缓存在内存中,但我怀疑这是最好的方法。)

另一种方法可能是使用HMACexample implementation)来控制对API调用的访问。此article中有评论说:

  

只是要向那些在他们的HTTPS服务上实现这一点的人们说清楚:你不需要在SSL上实施HMAC!绝对没有理由浪费时间和浪费复杂性。不要做。使用Basic Auth并完成它。

由于上述原因,我不同意这一点(使用HMAC进行一次身份验证并进行控制比每次验证更为实际。)

在使用SSL工作时,使用HMAC为Web API调用提供安全性是否是一种良好有效的做法,或者是否有任何我缺失的要点?

1 个答案:

答案 0 :(得分:2)

答案取决于您对安全的关注程度。

这个API用于什么?如果安全性是一个大问题,基本身份验证不是一个足够好的选择 - 即使您正在使用SSL。

即使您正在使用SSL,可以控制或访问初始请求的攻击者也可以伪装成所需的HTTPS网络服务,并轻松拦截您的流量(然后获取您的API凭据)

更好的解决方案是做几件事:

  • 使用API​​密钥和秘密。
  • 为每个请求生成唯一ID。
  • 为每个请求生成时间戳。
  • 根据您的API密钥秘密加密您的请求正文。
  • 将加密的输出放入以下格式的HTTP_AUTHORIZATION标头中:API_KEY_ID:
  • 在服务器端,解密有效负载。
  • 比较时间戳 - 如果请求之前发送的时间超过一秒 - 删除它(这可以防止时间攻击)。
  • 比较唯一ID - 如果此请求已执行 - 请将其删除(这可以防止重播攻击)。

上述策略使攻击者无法获得对您的API凭据的访问权限,即使他们能够成功地将您的API调用放在中间位置。

相关问题