基本概念
- AK/SK
一种身份认证方式(逻辑概念),常用于系统间接口调用时的身份验证。这种认证方式基于HTTP请求的头部,在请求中包含了Access Key和经过签名的信息,以验证请求的合法性。因此,可以说AK/SK认证是一种基于HTTP的认证方式。 - AK
Access Key (AK) 是一个全局唯一的字符串标识符,用于标识用户。它类似于用户名,仅用于身份识别,并不包含任何秘密信息。 - SK
Secret Access Key (SK)是一个高度保密的密钥,类似于密码,用于对发送至服务的请求进行签名。每个AK都有一个对应的SK,它们成对出现,共同完成安全认证过程。
认证过程
原文链接:https://blog.csdn.net/m0_51935980/article/details/136751458
-
创建与管理AK/SK:用户通过注册等方式等到访问密钥对(AK/SK),并下载保存。一般SK通常只在首次创建时展示一次,之后不可再查看,只能重新生成新的密钥对
-
构建带有签名的请求:客户端在发起API请求前,会先根据预定义的规范(签名算法)使用SK对请求参数进行签名处理。(
客户端构造
) -
发送请求:签名后的请求通过HTTP头字段(如Authorization等)携带鉴权信息发送给服务端(
客户端--HTTP请求--->服务端
) -
鉴权:服务端接收到请求后,从请求头取出AK并查找出其关联的SK,然后使用此SK按照相同的签名算法生产签名,判断和客户端SK生成的签名是否一致(
服务器鉴权
) -
响应与权限控制:验证通过后,服务端会执行请求的操作,并返回相应的响应内容;若签名验证失败,则拒绝请求并返回错误提示。(
服务器->客户端
)
请求重放安全问题
在AK/SK认证机制中,请求重放安全问题是指攻击者截获并重复发送之前的有效请求来假冒合法用户执行操作。为了防止这种攻击,服务端需要通常采用多种策略来确保API调用的一次性和不可重放性:
- 时间戳和有效期:在签名过程中包含时间戳信息,并且服务端会检查该时间戳是否在一定的时间窗口内(比如几分钟)。超过这个时间范围的请求将被拒绝,这样就阻止了过期请求的重放。
- 唯一请求ID:为每个请求生成一个唯一的标识符,并将其纳入签名内容中。服务端会跟踪已处理过的请求ID,当收到相同的请求ID时,将拒绝处理以防止重放攻击。
- 序列号或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文件
相关工具
- heapdump_tool(heapdump泄露扫描):https://github.com/wyzxxz/heapdump_tool
- JDumpSpider(HeapDump敏感信息提取工具):https://github.com/whwlsfb/JDumpSpider
- trufflehog(chrome扩展程序,探测页面是否有密钥泄露)