AWS 签名方法

文章链接:https://www.mtyun.com/doc/api/mss/mss/aws-v4–qian-ming
本文旨在理解什么是签名,大体流程,作为最基础了解,深入部分不做任何介绍。
签名:可以简单理解为通过一种加密方法对要传输的数据进行处理。

签名方式

签名方式大致分为两种:
1.HTTP头部签名 - 使用HTTP签名头部是认证MSS请求的最常用方法。
2**.HTTP预签名** - 可以使用查询字符串在URL中添加签名信息。因为请求签名是URL的一部分,所以这种类型的URL通常被称为预先签名的URL。可以使用预先分配的网址在HTML中嵌入可点击的链接,该链接最长可以有效七天。

首先说HTTP头部签名:
以下是基于HTTP头部签名方式的请求的Authorization标头值的示例。

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20161208/US/s3/aws4_request, 
SignedHeaders=host;range;x-amz-date, Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024

参数说明:
1. AWS4-HMAC-SHA256 :它是用于计算签名的算法。它分为两部分,一部分是AWS4,用来定AWS签名版本4(AWS4),一部分是HMAC-SHA256 ,用来指定签名算法(HMAC-SHA256)。
2. AKIAIOSFODNN7EXAMPLE/20161208/US/s3/aws4_request:我们的访问密钥和其他信息。此字符串具有以下形式:
access-key/date/aws-region/s3/aws4_request
3. SignedHeaders:以分号分隔的请求标头列表,用于计算Signature。 该列表仅包括头名称,并且头名称必须为小写
4. Signature: 它表示为64个小写十六进制字符的256位签名.

计算签名方法:

签名的过程包括如下几步:
1.规范化请求
2.生成待签名字符串
3.签名
签名流程图片

                 1.规范化请求

a. HTTP Verb中的Verb是一种HTTP方法,如GET,PUT,HEAD和DELETE
b. CanonicalURI是URI绝对路径组件的URI编码版本 - 以域名后面的“/”开头,直到字符串的末尾或以问号字符(’?’)开头的所有内容
例如:URI /examplebucket/myphoto.jpg是绝对路径,并且不在绝对路径中对“/”进行编码(其中URL可以替换为对应的路径)
c. CanonicalQueryString指定URI编码的查询字符串参数。需要对URI进行编码,并且必须按键名称按字母顺序对规范查询字符串中的参数进行排序,如:prefix=somePrefix&marker=someMarker
d. CanonicalHeaders是请求头及其值的列表。 每个由标题名称和值组成的对由换行符(“\ n”)分隔。 标题名称必须为小写,并且必须按字母顺序对标题名称进行排序以构造字符串,如下所示:

Lowercase(<HeaderName1>)+":"+Trim(<value>)+"\n"
Lowercase(<HeaderName2>)+":"+Trim(<value>)+"\n"

此外,计划要包含在请求中的任何x-amz- *标头也必须添加。
综上,一个完整的CanonicalHeaders如下所示:

host:mtmss.com
x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-amz-date:20130708T220855Z

e. SignedHeaders是按字母顺序排序的,以分号分隔的小写请求标题名称列表。 列表中的请求标头与您在CanonicalHeaders字符串中包含的标头相同

host;x-amz-content-sha256;x-amz-date

f. HashedPayload是请求有效内容的SHA256散列的十六进制值。

Hex(SHA256Hash(<payload>)
                   2.生成待签名字符串 
AWS V4是一种用于Amazon Web Services (AWS)请求签名的安全机制,它基于HMAC-SHA256算法,结合了AWS访问密钥、日期戳、区域和HTTP动词等元素来创建一个安全的签名。在Java中,你可以使用`aws-java-sdk-sns`或`aws-java-sdk-sts`等SDK库来生成V4签名。 以下是一个简单的步骤概述: 1. 引入依赖:首先,你需要在你的项目中添加AWS SDK的V4客户端库。 ```xml <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-sns</artifactId> <version>2.x.x</version> </dependency> ``` 2. 创建AWSCredentialsProvider:提供你的AWS访问密钥和秘密访问密钥。 ```java BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); ``` 3. 实例化Signer:使用AWS SDK提供的SignatureGenerator类。 ```java AmazonSNS sns = AmazonSNSClientBuilder.standard().withRegion(region) .withCredentials(new AWSStaticCredentialsProvider(credentials)).build(); SignatureGenerator signatureGenerator = new DefaultSignatureVersion4 signer(sns); ``` 4. 准备请求信息:包括服务名称(如sns)、HTTP方法、URI、查询参数、头信息和请求体(如果有的话)。 5. 调用generateSignableString()方法获取签名需要的字符串。 ```java String timestamp = // 获取当前UTC时间戳 String regionName = "your-region"; String serviceName = "sns"; Map<String, String> signedHeaders = new HashMap<>(); signedHeaders.put("host", endpoint.getHost()); // 如果有其他需要签名的头,添加到这个map里 HttpRequestInfo requestInfo = new HttpRequestInfo.Builder() .withHttpMethod(HttpMethod.POST) .withResourcePath("/your-resource") .withTimestamp(timestamp) .withSignedHeaders(signedHeaders) .build(); String canonicalRequest = signatureGenerator.generateCanonicalRequest(requestInfo); ``` 6. 生成并验证签名:最后,调用`sign()`方法生成完整的签名。 ```java String credentialScope = Joiner.on(':').join(timestamp, regionName, serviceName, "aws4_request"); String signingKey = getSigningKey(credentials.getSecretAccessKey(), credentialScope); String signature = Base64.getEncoder().encodeToString(signatureGenerator.sign(canonicalRequest, signingKey)); ``` 记得替换上述示例中的`accessKey`、`secretKey`、`region`、`endpoint`和具体的资源路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值