当我们向用户开放 Web API 访问时,我们需要确保每个 API 调用都经过认证。这意味着用户必须是他/她声称的那个人。

在这篇文章中,我们探讨两种常见方式:

  1. 基于令牌的认证
  2. HMAC(基于哈希的消息认证码)认证

下图说明了它们的工作原理。

基于令牌的认证

步骤 1:用户将密码输入客户端,客户端将密码发送到认证服务器。

步骤 2:认证服务器验证凭据并生成一个带有过期时间的令牌。

步骤 3 和 4:现在客户端可以在 HTTP 头中携带令牌发送请求来访问服务器资源。此访问有效直到令牌过期。

基于 HMAC 的认证

这种机制通过使用哈希函数(SHA256 或 MD5)生成消息认证码(签名)。

步骤 1 和 2:服务器生成两个密钥,一个是公共 APP ID(公钥),另一个是 API Key(私钥)。

步骤 3:我们现在在客户端生成 HMAC 签名(hmac A)。这个签名是使用图中列出的一组属性生成的。

步骤 4:客户端在 HTTP 头中携带 hmac A 发送请求来访问服务器资源。

步骤 5:服务器接收包含请求数据和认证头的请求。它从请求中提取必要的属性,并使用存储在服务器端的 API 密钥生成签名(hmac B)。

步骤 6 和 7:服务器比较 hmac A(客户端生成)和 hmac B(服务器生成)。如果它们匹配,请求的资源将返回给客户端。

问题

HMAC 认证如何确保数据完整性?为什么我们在 HMAC 签名生成中包含”请求时间戳”?

答案:

  • 数据完整性:HMAC 使用共享密钥和请求内容生成签名。任何对请求内容的篡改都会导致签名不匹配
  • 时间戳:防止重放攻击。服务器可以拒绝超过一定时间窗口的请求,确保每个请求都是新鲜的

本文为学习目的的个人翻译,译文仅供参考。

原文链接:How to design a secure web API access for your website?

版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。