Java实现AWS S3 V4 Authorization自定义验证

最近在开发文件存储服务,需要符合s3的协议标准,可以直接接入aws-sdk,本文针对sdk发出请求的鉴权信息进行重新组合再签名验证有效性,sdk版本如下

    <dependency>
        <groupId>software.amazon.awssdk</groupId>
        <artifactId>s3</artifactId>
        <version>2.20.45</version>
    </dependency>

算法解析
首先对V4版本签名算法的数据结构及签名流程进行拆解分析,以请求头签名为示例讲解

signature = doSign(waitSignString)

签名示例
请求头签名
AWS4-HMAC-SHA256 Credential=admin/20230530/us-east-1/s3/aws4_request, SignedHeaders=amz-sdk-invocation-id;amz-sdk-request;host;x-amz-content-sha256;x-amz-date, Signature=6f50628a101b46264c7783937be0366762683e0d319830b1844643e40b3b0ed
Url签名
http://localhost:8001/s3/kkk/test.docx?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20230531T024715Z&X-Amz-SignedHeaders=host&X-Amz-Expires=300&X-Amz-Credential=admin%2F20230531%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=038e2ea71073761aa0370215621599649e9228177c332a0a79f784b1a6d9ee39
数据结构
waitSignString = doHex(【第一部分】+【第二部分】+【第三部分】+【第四部分】),每部分使用\n换行符连接,第四部分不要加上换行符

第一部分
Algorithm – 用于创建规范请求的哈希的算法,对于 SHA-256,算法是 AWS4-HMAC-SHA256,则这部分的内容固定为

“AWS4-HMAC-SHA256” + “\n”
第二部分
RequestDateTime – 在凭证范围内使用的日期和时间,这个时间为请求发出的时间,直接从请求头获取x-amz-date即可,这部分内容为

request.getHeader(“x-amz-date”) + “\n”
第三部分
CredentialScope – 凭证范围,这会将生成的签名限制在指定的区域和服务范围内,该字符串采用以下格式:YYYYMMDD/region/service/aws4_request

这部分由4个内容信息拼接组成

请求时间的YYYYMMDD格式
存储区域
存储服务
请求头
这些信息我们都可以从请求头的Authorization凭证提取出Credential部分进行拆分重新组合

    String[] parts = authorization.trim().split("\\,");
    String credential = parts[0].split("\\=")[1];
    String[] credentials = credential.split("\\/");
    String accessKey = credentials[0];
    if (!accessKeyId.equals(accessKey)) {
        return false;
    }
    String date = credentials[1];
    String region = credentials[2];
    String service = credentials[3];
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值