标题: API 防护技术 分类: 工具 创建: 2025-07-10 22:50 修改: 链接: http://0x2531.tech/tools/202507102250.txt -------------------------------------------------------------------------------- 在互联网应用场景下,API 的应用非常普遍。API 主要提供数据交换和远程操作两种能力,我们在发挥 API 能力 的同时,也希望保证安全性。本文将介绍几种保护 API 安全性的技术,这些技术各有侧重点和针对性,需结合实 际需求,选择或组合使用。 1、API key API key 主要的用途是验证调用方身份的合法性,其有效性依赖 API key 他人无法获知这一点,一旦遭到泄 露,调用方身份合法性也就无从谈起了。其实现原理如下: 1)服务端为每个调用方(用户/设备)分配唯一 key,如:ak_9a8b7c6d5e,使用该 key 标识调用方身份; 2)调用方在请求 API 的请求头中传递该 key,如:Authorization: Bearer ak_9a8b7c6d5e; 3)服务端校验 key 是否存在、是否过期或是否有权限执行本次操作。 下面是一个请求示例: curl https://api.deepseek.com/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ "model": "deepseek-chat", "messages": [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Hello!"} ], "stream": false }' 通过 API key 可以用来控制合理的调用方,拦截未授权访问。另外,也可以实现权限的分类分级,相较于传统的 基于账号授权有更高的安全性。当然,正如前文介绍,API key 有效的前提是确保 key 的保密性。所以,作为调 用方须妥善保管各自的 key,不要与他人共享,或将其暴露在浏览器或其他客户端代码中。同时,服务方也可监控 key 的使用情况,一旦发现已公开泄露的 key,则自动禁用。 2、API 签名 API 签名确保请求在传输过程中不被篡改且不被重复使用。其实现原理如下: 1)客户端生成签名,拼接请求参数、时间戳和随机 Nonce,使用密钥(和 API key 关联,但不同于 API key)通过哈希算法 HMAC-SHA256 计算签名。 sign = hmac.new(secret_key, (params + timestamp + nonce).encode(), 'sha256').hexdigest() 2)服务端首先校验随机 Nonce 唯一性和时间戳,然后用相同逻辑生成签名并比对。 最终,url 大致长这样:https://xxx/api?sign=xxx×tamp=xxx&nonce=xxx¶ms=xxx 通过 API 签名防护如下的攻击场景: 1)修改参数,遍历请求攻击,此时验签失败; 2)重放请求攻击,由于随机 Nonce 已使用,请求将失败; 3)在某个时间窗口允许重放,超过有效期则请求失败。 由于 API 签名不加密请求参数,所以请求参数可能在网络传输过程中被嗅探。当传递敏感的请求参数时,需考 虑使用证书绑定(客户端主动校验服务端证书)或参数加密的方式防范中间人攻击。 3、参数加密 参数加密保护在网络传输过程中敏感数据的保密性,防止被中间人嗅探攻击。其实现原理如下: 1)客户端动态生成随机密钥,使用该密钥加密请求参数,并使用非对称公钥加密该密钥; 2)服务端使用非对称私钥解密密钥,使用该密钥解密请求参数,然后处理业务逻辑; 3)服务端使用密钥加密响应数据,并返回给客户端。 参数加密后的参数大致如下: { "data": "aes_encrypted_data", # 使用对称密钥加密请求参数 "key": "rsa_encrypted_key" # 使用非对称公钥加密对称密钥 } 这其中的关键在于使用非对称加密在客户端和服务端之间传递密钥,保证了密钥的安全性。通过参数加密,既保 护了敏感数据,又隐藏了业务参数从而隐藏业务逻辑。但也应注意到,加解密操作会消耗一定的计算资源,在性能 要求较高的场景下,需权衡考虑。 总的来说,API key 解决身份认证问题(你是谁),API 签名解决请求完整性问题(请求是否被篡改),参数 加密解决数据保密性问题(请求参数是否被中间人嗅探)。