有奖捉虫:办公协同&微信生态&物联网文档专题 HOT

功能简介

在腾讯云对象存储(Cloud Object Storage,COS)中,您可以通过 REST API 对 COS 发起 HTTP 匿名请求或 HTTP 签名请求。对于签名请求,COS 服务器端将会进行对请求发起者的身份认证。COS 是基于密钥 HMAC(Hash Message Authentication Code)的自定义方案进行的身份认证。
签名请求和匿名请求的详细说明如下:
签名请求:HTTP 请求时携带签名,COS 服务器端收到消息后,进行身份验证,验证成功则可接受并执行请求,否则将会返回错误信息并丢弃此请求。
匿名请求:HTTP 请求不携带任何身份标识和鉴权信息,通过 REST API 进行 HTTP 请求操作。
关于如何创建请求,请参见 创建请求概述

适用场景

在 COS 服务使用的场景中,对于需要对外发布类的数据,通常可将对象设置为公有读私有写。即所有人可查看,通过 ACL 策略指定账号可写入。此时,可将 ACL 策略与 API 请求签名相结合,对访问进行身份验证,并对操作进行权限和有效期的控制。
在签名的使用场景中,可对 API 请求进行多方面的安全防护:
请求者身份验证。通过访问者唯一 ID 和密钥确定请求者身份。
防止传输数据篡改。对数据签名并检验,保障传输内容完整性。
防止签名被盗用。对签名设置时效,避免签名盗用并重复使用。
在对象存储中,请求签名有三种方式,推荐使用方式一和方式二:
方式一:SDK 签名:适用于开发者直接使用 SDK 请求 COS 的场景。
方式二:签名 URL:适用于 COS 用户直接通过签名链接访问 COS 的场景。
方式三:在线签名工具:适用于临时生成签名链接、理解签名算法等场景。

注意事项

此文档仅适用于 COS XML 版本。
此文档不适用于 POST Object 的 HTTP 请求。
此文档仅适用于在您希望通过原始 API 进行二次开发时,需要根据本文所描述步骤进行操作。

方式一:SDK 签名

COS SDK 已经实现签名,在使用 SDK 发起请求或通过 SDK 获取签名时无需关注签名问题。如果您需要自行实现签名或了解各语言的具体实现,可参考各语言 SDK 的签名实现文件:
SDK
签名实现文件
Android SDK
C SDK
C++ SDK
.NET(C#) SDK
IQCloudSigner.cs (class CosXmlSigner)
Go SDK
auth.go
iOS SDK
Java SDK
JavaScript SDK
util.js (getAuth)
Node.js SDK
util.js (getAuth)
PHP SDK
Python SDK
小程序 SDK
util.js (getAuth)

方式二:签名 URL

COS 目前支持的各语言 SDK 都提供了生成签名链接的功能,生成的链接 URL 中附带有一定有效期的签名,且该签名支持 PUT 请求或 GET 请求,因此您可以直接使用该链接上传或下载对象而不需要额外生成签名。
在生成用于上传的签名链接时,还可以指定 Content-Type 或 Content-MD5 等头部,以便限制上传的媒体类型或限制上传的内容必须为指定内容。有关上传时的请求头部设置,请参阅 PUT Object 文档。
在生成用于下载的签名链接时,还可以指定 response-xxx 请求参数,以便在下载时临时修改响应中的相关头部。有关下载时的请求参数设置,请参阅 GET Object 文档。
各语言 SDK 生成签名链接的详细介绍,请参见下列各语言 SDK 文档:
说明
建议用户使用临时密钥生成预签名,通过临时授权的方式进一步提高预签名上传、下载等请求的安全性。申请临时密钥时,请遵循 最小权限指引原则,防止泄露目标存储桶或对象之外的资源。
如果您一定要使用永久密钥来生成预签名,建议永久密钥的权限范围仅限于上传或下载操作,以规避风险。
SDK
预签名文档
Android SDK
C SDK
C++ SDK
.NET(C#) SDK
Go SDK
iOS SDK
Java SDK
JavaScript SDK
Node.js SDK
PHP SDK
Python SDK
小程序 SDK

方式三:在线签名工具

COS 目前提供了 COS 签名工具,用户可使用该工具临时生成签名或参考签名生成过程,详细的使用方法请参见 COS 签名工具 文档。

签名算法原理和使用

准备工作

签名计算

签名使用

通过 RESTful API 对 COS 发起的 HTTP 签名请求,可以通过以下几种方式传递签名:
1. 通过标准的 HTTP Authorization 头,例如 Authorization: q-sign-algorithm=sha1&q-ak=...&q-sign-time=1557989753;1557996953&...&q-signature=...
2. 作为 HTTP 请求参数,请注意 UrlEncode,例如 /exampleobject?q-sign-algorithm=sha1&q-ak=...&q-sign-time=1557989753%3B1557996953&...&q-signature=...
说明
上述示例中使用 ... 省略了部分具体签名内容。
如果在计算签名时使用了临时安全凭证(临时密钥),那么在发送请求时还应传入安全令牌字段 x-cos-security-token,根据签名使用方式不同,安全令牌字段的传入方式也有所不同:
1. 当通过标准的 HTTP Authorization 头传入签名时,应同时通过 x-cos-security-token 请求头部传入安全令牌字段,例如:
Authorization: q-sign-algorithm=sha1&q-ak=...&q-sign-time=1557989753;1557996953&...&q-signature=...
x-cos-security-token: ...
2. 当通过 HTTP 请求参数传入签名时,应同时通过 x-cos-security-token 请求参数传入安全令牌字段,例如:
/exampleobject?q-sign-algorithm=sha1&q-ak=...&q-sign-time=1557989753%3B1557996953&...&q-signature=...&x-cos-security-token=...
说明
上述示例中使用 ... 省略了部分具体签名和安全访问令牌内容。

签名示例

附录

伪代码

KeyTime = [Now];[Expires]
SignKey = HMAC-SHA1([SecretKey], KeyTime)
HttpString = [HttpMethod]\\n[HttpURI]\\n[HttpParameters]\\n[HttpHeaders]\\n
StringToSign = sha1\\nKeyTime\\nSHA1(HttpString)\\n
Signature = HMAC-SHA1(SignKey, StringToSign)

消息摘要算法示例

不同语言如何调用 HMAC-SHA1 可以参考下面的示例: