AK/SK认证方式

基本概念

  1. AK/SK
    一种身份认证方式(逻辑概念),常用于系统间接口调用时的身份验证。这种认证方式基于HTTP请求的头部,在请求中包含了Access Key和经过签名的信息,以验证请求的合法性。因此,可以说AK/SK认证是一种基于HTTP的认证方式。
  2. AK
    Access Key (AK) 是一个全局唯一的字符串标识符,用于标识用户。它类似于用户名,仅用于身份识别,并不包含任何秘密信息。
  3. SK
    Secret Access Key (SK)是一个高度保密的密钥,类似于密码,用于对发送至服务的请求进行签名。每个AK都有一个对应的SK,它们成对出现,共同完成安全认证过程。

认证过程

原文链接:https://blog.csdn.net/m0_51935980/article/details/136751458

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

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

  3. 发送请求:签名后的请求通过HTTP头字段(如Authorization等)携带鉴权信息发送给服务端(客户端--HTTP请求--->服务端

  4. 鉴权:服务端接收到请求后,从请求头取出AK并查找出其关联的SK,然后使用此SK按照相同的签名算法生产签名,判断和客户端SK生成的签名是否一致(服务器鉴权

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

请求重放安全问题

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

  1. 时间戳和有效期:在签名过程中包含时间戳信息,并且服务端会检查该时间戳是否在一定的时间窗口内(比如几分钟)。超过这个时间范围的请求将被拒绝,这样就阻止了过期请求的重放。
  2. 唯一请求ID:为每个请求生成一个唯一的标识符,并将其纳入签名内容中。服务端会跟踪已处理过的请求ID,当收到相同的请求ID时,将拒绝处理以防止重放攻击。
  3. 序列号或nonce:使用递增的序列号或者一次性随机值nonce作为请求的一部分进行签名,服务端会验证每个新请求的序列号或nonce未被使用过。

AK/SK 泄露

可参考链接:

https://blog.csdn.net/m0_64910183/article/details/135206506

AK/SK认证常用于云服务的API访问,如对象存储、云服务器、数据库服务等。
由上文可知,如若攻击者同时拿到 AK/SK 这一对密钥也能够向云服务证明自己的合法身份,所以出现了一种叫 云主机秘钥泄露 的风险。

常见云主机密钥泄露场景

  • 报错页面或者debug信息调试
  • GITHUB关键字、FOFA等
  • 网站的配置文件
  • js文件中泄露
  • 源码泄露:APK、小程序反编译后全局搜索查询
  • 文件上传、下载的时候也有可能会有泄露,比如上传图片、上传文档等位置。
  • HeapDump文件

相关工具

  • 23
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Java中的HttpURLConnection和POST方法来访问AK/SK认证方式的HTTP接口。以下是一个示例代码: ```java import java.net.*; import java.io.*; public class AKSKDemo { public static void main(String[] args) throws Exception { String ak = "your-ak"; String sk = "your-sk"; // 接口地址 String url = "http://111.203.10.155/MicroApp/nmsmc-system-basic/dict"; // 构造POST请求 URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("POST"); // 设置AK/SK认证头部信息 String auth = ak + ":" + sk; byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes()); String authHeader = "Basic " + new String(encodedAuth); con.setRequestProperty("Authorization", authHeader); // 发送POST请求 con.setDoOutput(true); OutputStream os = con.getOutputStream(); os.write("param1=value1&param2=value2".getBytes()); os.flush(); os.close(); // 处理响应结果 int responseCode = con.getResponseCode(); System.out.println("Response Code: " + responseCode); BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); System.out.println("Response Body: " + response.toString()); } } ``` 在代码中,需要将`your-ak`和`your-sk`替换为你的AKSK。在发送POST请求时,需要将请求参数以`param1=value1&param2=value2`的形式写入请求体中。接口返回的响应结果可以通过`con.getInputStream()`获取,然后通过`BufferedReader`读取响应结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值