# 签名算法

## 数据假设

在生成 API 请求中的签名（`Signature`）时，需要提供账户密钥，即控制台「API 密钥」页面中的 **AccessKey ID** 和 **AccessKey Secret**，
密钥可以从 [控制台](https://console.netlake.cn/uaccount/api_manage) 获取。

本例中假设

```
PublicKey  = 'someone@example.com1296235120854146120'   # AccessKey ID
PrivateKey = '46f09bb9fab4f12dfc160dae12273d5332b5debe' # AccessKey Secret
```

> 💡 你可以使用上述的 `PublicKey`（AccessKey ID）和 `PrivateKey`（AccessKey Secret）调试你的代码， 当得到跟后面一致的签名结果后（即表示你的代码是正确的），可再换为你自己的 AccessKey ID 和 AccessKey Secret 以及其他 API 请求。

本例中假设用户请求参数串如下:

```json
{
    "Action"     :  "DescribeUHostInstance",
    "Region"     :  "cn-bj2",
    "Limit"      :  10,
    "PublicKey"  :  "someone@example.com1296235120854146120"
}
```

生成被签名串的 SHA1 签名，即是请求参数 `Signature` 的值。

按照上述算法，本例中，计算出的 `Signature` 为 **4201919d267504385deb93af19e0197870fed36b** 。

## 构造签名

### 1. 将请求参数按照名称进行升序排列

```json
{
    "Action"     :  "DescribeUHostInstance",
    "Limit"      :  10,
    "PublicKey"  :  "someone@example.com1296235120854146120",
    "Region"     :  "cn-bj2"
}
```

### 2. 构造被签名参数串

被签名串的构造规则为: 被签名串 = 所有请求参数拼接(无需 HTTP 转义)。并在本签名串的结尾拼接 AccessKey Secret（请求参数名 `PrivateKey`）。

```
ActionDescribeUHostInstanceLimit10PublicKeysomeone@example.com1296235120854146120Regioncn-bj246f09bb9fab4f12dfc160dae12273d5332b5debe
```

注意：

- 对于 bool 类型，应编码为 `true/false`
- 对于浮点数类型，如果小数部分为 0，应仅保留整数部分，如 `42.0` 应保留 `42`
- 对于浮点数类型，不能使用科学计数法

### 3. 计算签名

使用 SHA1 编码被签名串，生成最终签名。
