
# 用户签名验证
SFS通过AK/SK对请求进行签名，在向SFS发送请求时，客户端发送的每个消息头需要包含由SK、请求时间、请求类型等信息生成的签名信息。
- AK(Access Key ID)：访问密钥ID。与私有访问密钥关联的唯一标识符；访问密钥ID和私有访问密钥一起使用，对请求进行加密签名。格式例如：HCY8BGCN1YM5ZWYOK1MH
- SK(Secret Access Key)：与访问密钥ID结合使用的密钥，对请求进行加密签名，可标识发送方，并防止请求被修改。格式例如：9zYwf1uabSQY0JTnFqbUqG7vcfqYBaTdXde2GUcq
用户可以在IAM服务中获取AK和SK，获取的方法请参见[获取访问密钥（AK/SK）](https://support.huaweicloud.com/api-sfs/sfs_02_0120.html)。
SFS根据应用场景，提供了[Header中携带签名](https://support.huaweicloud.com/api-sfs/sfs_02_0104.html)的签名计算方式。
以Header中携带签名为例，用户签名验证流程如[表1]所示。Header中携带签名方法的具体参数说明及代码示例，请参见[Header中携带签名](https://support.huaweicloud.com/api-sfs/sfs_02_0104.html)。
 表1SFS签名计算和验证步骤 
| 步骤                                || 示例                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
|:---|---|:---|
| 签名计算 | 1. 构造HTTP消息                 | PUT /HTTP/1.1 Host: filesystem.sfs3.cn-north-4.myhuaweicloud.com Date: Tue, 04 Jun 2019 06:54:59 GMT Content-Type: text/plain Content-Length: 5913                                                                                                                 |
| 签名计算 | 2. 按照签名规则计算**StringToSign** | StringToSign = HTTP-Verb + "\\n" + Content-MD5 + "\\n" + Content-Type + "\\n" + Date + "\\n" + CanonicalizedHeaders + CanonicalizedResource                                                                                                                                                                                                                                                                                                                                                                      |
| 签名计算 | 3. 准备AK和SK                  | AK: \*\*\*\*\*\* SK: \*\*\*\*\*\*                                                                                                                                                                                                                                                                                                                                                                                                                     |
| 签名计算 | 4. 计算签名**Signature**        | Signature = Base64( HMAC-SHA1( **SecretAccessKeyID** , UTF-8-Encoding-Of( **StringToSign** ) ) )                                                                                                                                                                                                                                                                                                                                                                                                                 |
| 签名计算 | 5. 添加签名头域发送到SFS服务           | PUT /object HTTP/1.1 Host: filesystem.sfs3.cn-north-4.myhuaweicloud.com Date: Tue, 04 Jun 2019 06:54:59 GMT Content-Type: text/plain Content-Length: 5913 Authorization: OBS **AccessKeyID** :**Signature** |
| 签名验证 | 6. 接收HTTP消息                 | PUT / HTTP/1.1 Host: filesystem.sfs3.cn-north-4.myhuaweicloud.com Date: Tue, 04 Jun 2019 06:54:59 GMT Content-Type: text/plain Content-Length: 5913 Authorization: OBS **AccessKeyID** :**Signature**  |
| 签名验证 | 7. 根据请求中的AK获取SK             | 从头域Authorization中取出AK，去IAM取回用户的SK                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| 签名验证 | 8. 按照签名规则计算**StringToSign** | StringToSign = HTTP-Verb + "\\n" + Content-MD5 + "\\n" + Content-Type + "\\n" + Date + "\\n" + CanonicalizedHeaders + CanonicalizedResource                                                                                                                                                                                                                                                                                                                                                                      |
| 签名验证 | 9. 计算签名**Signature**        | Signature = Base64( HMAC-SHA1( **SecretAccessKeyID** , UTF-8-Encoding-Of( **StringToSign** ) ) )                                                                                                                                                                                                                                                                                                                                                                                                                 |
| 签名验证 | 10. 验证签名                    | 验证头域Authorization中的**Signature** 与服务端计算的**Signature**是否相等 相等：签名验证通过 不相等：签名验证失败                                                                                                                                                                                                                                                                                                            |
   
