AK/SK加密认证

本文详细解释了AccessKey和SecretAccessKey在IT服务中的角色,描述了AK/SK认证流程,包括创建、管理和签名请求的过程。同时关注了请求重放安全问题,通过时间戳、唯一请求ID和nonce策略来保障API调用的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、AK/SK概念

  1. Access Key (AK):AK是一个全局唯一的字符串标识符,用于标识用户。它类似于用户名,但仅用于身份识别,并不包含任何秘密信息。

  2. Secret Access Key (SK):SK则是一个高度保密的密钥,类似于密码,用于对发送至服务的请求进行签名。每个AK都有一个对应的SK,它们成对出现,共同完成安全认证过程。

  3. 签名算法与认证流程

    • 在AK/SK认证中,客户端使用SK对HTTP请求的内容(包括但不限于请求方法、URL路径、参数、时间戳等)进行特定的哈希运算,生成一个签名Hutool封装的签名算法
    • 这个签名随请求一起发送到服务端,服务端收到请求后,利用存储的对应AK的SK以同样的规则计算签名,然后比较两者是否一致,以此来验证请求的完整性和发送者的身份。

二、AK/SK认证流程

  1. 创建与管理AK/SK:用户通过注册等方式等到访问密钥对(AK/SK),并下载保存。一般SK通常只在首次创建时展示一次,之后不可再查看,只能重新生成新的密钥对,也是为了保证安全

  2. 构建带有签名的请求:客户端在发起API请求前,会先根据预定义的规范(签名算法)使用SK对请求参数进行签名处理。

  3. 发送请求与鉴权:签名后的请求通过HTTP头字段(如Authorization等)携带鉴权信息发送给服务端,服务端接收到请求后,从请求头取出AK并查找出其关联的SK,然后使用此SK按照相同的签名算法生产签名,判断和客户端SK生成的签名是否一致
    我们需要获取用户传递的 accessKey 和 secretKey。对于这种数据,建议不要直接在 URL 中传递,而是选择在请求头中传递会更为妥当。因为 GET 请求的 URL 存在最大长度限制,如果你传递的其他参数过多,可能会导致关键数据被挤出。因此,建议从请求头中获取这些数据

  4. 响应与权限控制:验证通过后,服务端会执行请求的操作,并返回相应的响应内容;若签名验证失败,则拒绝请求并返回错误提示。

三、请求重放安全问题

在AK/SK认证机制中,请求重放安全问题是指攻击者截获并重复发送之前的有效请求来假冒合法用户执行操作。为了防止这种攻击,服务端需要通常采用多种策略来确保API调用的一次性和不可重放性:

  1. 时间戳和有效期:在签名过程中包含时间戳信息,并且服务端会检查该时间戳是否在一定的时间窗口内(比如几分钟)。超过这个时间范围的请求将被拒绝,这样就阻止了过期请求的重放。

  2. 唯一请求ID:为每个请求生成一个唯一的标识符,并将其纳入签名内容中。服务端会跟踪已处理过的请求ID,当收到相同的请求ID时,将拒绝处理以防止重放攻击。

  3. 序列号或nonce:使用递增的序列号或者一次性随机值nonce作为请求的一部分进行签名,服务端会验证每个新请求的序列号或nonce未被使用过。

### 如何在 Postman 中配置 AK/SK 认证 为了在 Postman 中实现 AK/SK 身份验证,需按照如下方式进行设置: #### 配置环境变量 建议先创建一组环境变量来存储 `Access Key` 和 `Secret Access Key` ,以便于管理和安全性。 1. 打开Postman并进入所需集合或全局环境设置。 2. 添加两个新的环境变量:一个是`accessKey`,另一个是`secretKey`,分别填入相应的AKSK值[^1]。 #### 编写预请求脚本 由于大多数API服务要求对请求参数进行加密处理,所以通常会在发送前通过Pre-request Script自动生成签名。下面是一段简单的JavaScript代码片段,展示了如何利用SHA-256算法结合时间戳生成HMAC-SHA256类型的signature: ```javascript const cryptoJs = require("crypto-js"); pm.environment.set("timestamp", new Date().toISOString()); let stringToSign = pm.environment.get('method') + '\n' + pm.environment.get('uriPath') + '\n' + pm.environment.get('queryString') + '\n' + pm.environment.get('bodyHash') + '\n' + pm.environment.get('timestamp'); // 使用CryptoJS库中的HmacSHA256函数计算签名 let secretKey = pm.environment.get('secretKey'); let signature = CryptoJS.HmacSHA256(stringToSign, secretKey).toString(CryptoJS.enc.Hex); pm.environment.set("signature", signature); ``` 注意:上述代码假定已安装了必要的第三方库(如CryptoJS)。如果未预先加载这些依赖项,则可能需要调整具体实现细节以适应实际情况。 #### 设置请求头 最后一步是在Headers选项卡里加入必需的身份验证信息。对于采用AK/SK机制的服务来说,一般会涉及到以下几个关键字段: - **Authorization**: 构造格式为 "AK {your_access_key}:{generated_signature}" 的字符串作为此header的value部分; - **Date/X-Amz-Date**: 如果API文档中有特别说明的话,应该提供一个标准的时间表示法,比如ISO 8601格式化后的当前日期时间; - **Content-Type**: 明确指定payload的内容类型,例如application/json; 确保以上提到的各项都已被正确定义,并且其取值能够反映实际应用场景下的需求特点[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米开浪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值