amazon s3 的用户验证 access-key, secrete-key
amazon s3的用户验证方式是一种对称加密方式,下面介绍此加密方式。
请求的构造
请求元素:
- AWS Access Key Id:其实就是常见的用户名,用来区分用户的。
- Signature:签名,使用私钥计算后得出。
- Timestamp:时间戳
- Date:时间,为每一个请求设置一个过期时间。
验证过程
客户端:经过下面3个步骤
1 构建http请求。
2 使用请求内容(request_str) 和 secret-key计算签名(signature)。
3 发送请求到aws服务器。
aws服务器:经过下面三个步骤
4 Amazon S3 根据发送的access-key得到对应的secret-key。
5 Amazon S3 使用同样的算法将请求内容(request_str) 和 secret-key一起计算签名(signature)!和步骤2一样。
6 对比用户发送的签名和Amazon S3计算的签名,判断是否合法。
签名的构造过程
Authorization = "AWS" + " " + AWSAccessKeyId + ":" + Signature; Signature = Base64( HMAC-SHA1( UTF-8-Encoding-Of( YourSecretAccessKeyID, StringToSign ) ) ); StringToSign = HTTP-Verb + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" + CanonicalizedAmzHeaders + CanonicalizedResource; CanonicalizedResource = [ "/" + Bucket ] + <HTTP-Request-URI, from the protocol name up to the query string> + [ sub-resource, if present. For example "?acl", "?location", "?logging", or "?torrent"]; CanonicalizedAmzHeaders = <described below>
Example
客户端
假设:
AWSAccessKeyId: AKIAIOSFODNN7EXAMPLE
AWSSecretAccessKey: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
假设我们需要发送下面这样的请求:
DELETE /puppy.jpg HTTP/1.1 User-Agent: dotnet Host: mybucket.s3.amazonaws.com Date: Tue, 15 Jan 2008 21:20:27 +0000 x-amz-date: Tue, 15 Jan 2008 21:20:27 +0000 Authorization: AWS AKIAIOSFODNN7EXAMPLE:k3nL7gH3+PadhTEVn5EXAMPLE
1. 构建除Authorization之外的其他字段。
DELETE /puppy.jpg HTTP/1.1 User-Agent: dotnet Host: mybucket.s3.amazonaws.com Date: Tue, 15 Jan 2008 21:20:27 +0000 x-amz-date: Tue, 15 Jan 2008 21:20:27 +0000
2. 提取request_str: