当向外部服务暴露 API 时,确保安全通信至关重要,以防止未经授权的访问和数据泄露。
两种常用的 API 安全方法是基于 Token 的身份认证和基于 HMAC(哈希消息认证码)的认证。
下面我们来介绍这两种方法的工作原理,并比较它们的不同之处。
图片
01 基于令牌
- 第 1 步 - 用户在客户端输入密码,客户端将密码发送给验证服务器。
- 第 2 步 - 验证服务器验证凭据并生成一个有有效期的令牌。
- 第 3 步和第 4 步 - 现在,客户端可以发送请求,客户端在每个 API 请求的 Authorization 头中包含这个Token,访问服务器资源。这种访问在令牌过期前一直有效。
优点
- 无状态:服务器不需要维护会话状态,Token 本身包含验证所需的所有信息。
- 灵活性:Token 可以包含角色或权限等元数据,支持细粒度的访问控制。
- 支持 OAuth 集成:与OAuth 2.0 兼容,适合第三方集成场景。
缺点
- Token 泄露风险:如果 Token 被拦截,攻击者可以在 Token 过期前滥用它,除非有其他机制(如 Token 吊销)在起作用。
- Token 存储:客户端需要安全存储 Token,对于 Web 或移动应用程序来说,这可能比较复杂。
02 基于 HMAC
该机制使用哈希函数(SHA256 或 MD5)生成消息验证码(签名)。
- 第 1 和 2 步 - 服务器生成两个密钥,一个是公共 APP ID(公钥),另一个是 API 密钥(私钥)。
- 第 3 步:现在我们在客户端生成一个 HMAC 签名(hmac A)。该签名是根据图中列出的一组属性生成的。
- 第 4 步 - 客户端发送访问服务器资源的请求,HTTP 头中包含 hmac A。
- 第 5 步 - 服务器收到包含请求数据和身份验证标头的请求。它从请求中提取必要的属性,并使用存储在服务器端的 API 密钥生成签名(hmac B。)
- 第 6 和 7 步 - 服务器会比较 hmac A(在客户端生成)和 hmac B(在服务器端生成)。如果两者匹配,请求的资源将返回给客户端。
优点
- 防篡改:HMAC 确保请求在传输过程中未被篡改,哪怕只改变一个字节,签名也会不匹配。
- 简单:不需要 Token 的发放或刷新,仅依赖共享密钥和哈希算法。
- 无 Token 泄露风险:因为没有 Token 可被盗取,这种方法天然安全。
缺点
- 密钥管理:客户端和服务器都必须安全地管理和存储共享密钥。一旦密钥泄露,安全性就会受到影响。
- 无状态 API 较复杂:HMAC 不提供内嵌元数据的无状态认证,访问控制需要单独处理。
在 HMAC 签名中加入时间戳是为了防止重放攻击(replay attack)。重放攻击是一种网络攻击方式,攻击者拦截合法的请求并在之后重复发送相同的请求,试图伪造身份或重复操作。通过时间戳,服务器可以验证请求是否在合理的时间范围内,从而大大提高系统的安全性。