我们一起聊聊如何设计安全的对外 API?

开发 前端
在 HMAC 签名中加入时间戳是为了防止重放攻击(replay attack)。重放攻击是一种网络攻击方式,攻击者拦截合法的请求并在之后重复发送相同的请求,试图伪造身份或重复操作。

当向外部服务暴露 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)。重放攻击是一种网络攻击方式,攻击者拦截合法的请求并在之后重复发送相同的请求,试图伪造身份或重复操作。通过时间戳,服务器可以验证请求是否在合理的时间范围内,从而大大提高系统的安全性。

责任编辑:武晓燕 来源: ByteByteGo
相关推荐

2022-05-24 08:21:16

数据安全API

2024-11-27 08:47:12

2022-02-14 07:03:31

网站安全MFA

2022-01-04 12:08:46

设计接口

2023-11-10 08:04:43

Java 17Java 11JDK

2024-02-02 09:21:57

API性能策略

2024-02-20 13:00:00

架构设计模块

2023-11-30 07:40:05

URLCMS

2024-10-29 11:19:23

点赞系统同步

2024-06-17 11:59:39

2024-11-27 16:07:45

2024-09-30 09:33:31

2023-04-03 00:09:13

2024-09-09 00:00:00

编写技术文档

2022-10-08 00:00:05

SQL机制结构

2023-04-26 07:30:00

promptUI非结构化

2023-08-04 08:20:56

DockerfileDocker工具

2023-06-30 08:18:51

敏捷开发模式

2023-09-10 21:42:31

2023-08-10 08:28:46

网络编程通信
点赞
收藏

51CTO技术栈公众号