## 1签名 & 数据加密
### 1.1 简介
1.第三方从融易推平台获取aes_iv,aec_key和请求签名密钥(sign_key)。
2.双方每次API交互都需要做请求签名、加密处理。
### 1.2 公共参数
| 参数 | 类型 | 必填 | 描述 |
| --- | --- | --- | --- |
| data | string | 是 | 加密数据 |
| random | string | 是 | 随机数32位 |
| sign | string | 是 | 签名 |
| channel | string | 是 | 接口对应名称 |
| timestamp | int | 是 | 时间戳 |
| token | string | 是 | 随机数32位 |
| partner | string | 是 | 第三方标识 |
| sync | bool | 是 | 是否同步,默认请传false |
### 1.3 签名算法及规则
#### 1.3.1 描述
将参数按照 key 首字母排序后连接成字符串,再拼接有服务端 供的签名 key,最后 MD5 得到签名结果。(sync不参与验签)
#### 1.3.2 参数示例
```php
{
"data":"Kdijdiwe78&*Wjslfds",
"random":"7737261D-0C27-1652-AE4D-78521ECD722C",
"channel":"register_user",
"timestamp":12313212312
}
```
假设签名key(sign_key) :
```
dsf123fsfk123SJD
```
签名结果(sign):
```
MD5('register_userKdijdiwe78&*Wjslfds7737261D-0C27-1652-AE4D-78521ECD722C12313212312dsf123fsfk123SJD');
```
#### 1.3.3 示例代码
```php
public function createKey($data) {
ksort($data);
return md5(implode('' ,$data).Config::get('api.sign_key'));
}
```
### 1.4 Data 参数加密算法及协商密钥
#### 1.4.1 描述
参数使用 AES 加密,解密 key 有服务端供,注意:在用 java 语言加密时要注意, AES/CBC/NoPadding 模式下当加密数据长度不是 16 的整数倍时不补 0,所以要实现长度不是 16 的整数倍,要自动补 0。
#### 1.4.2 代码示例
php 加密
```php
public static function apiEncrypt($data) {
$key = Config::get('api.aes_key');
$iv = Config::get('api.aes_iv');
$cipher = MCRYPT_RIJNDAEL_128;
$mode = MCRYPT_MODE_CBC;
$data=json_encode($data);
$encrypt_data = mcrypt_encrypt($cipher,$key, $data, $mode, $iv); $data= base64_encode($encrypt_data);
return $data;
}
```
php 解密
``` php
public function apiDecrypt($data) {
$key = Config::get('api.aes_key');
$iv = Config::get('api.aes_iv');
$cipher = MCRYPT_RIJNDAEL_128;
$mode = MCRYPT_MODE_CBC;
$data= base64_decode($data);
$encrypt_data = mcrypt_decrypt($cipher,$key, $data, $mode, $iv);
$encrypt_data = str_replace("\0","",$encrypt_data);
$data= json_decode($encrypt_data,true);
return $data;
}
```
#### 1.4.3 php7 代码示例
加密
```php
public function apiEncrypt($data)
{
$key = $this->initParams['aes_key'];
$iv = $this->initParams['aes_iv'];
$data=json_encode($data);
$message_padded = $data;
if (strlen($message_padded) % 16) {
$message_padded = str_pad($message_padded,strlen($message_padded) + 16 - strlen($message_padded) % 16, "\0");
}
$encrypt_data = openssl_encrypt($message_padded,"aes-128-cbc", $key,OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv);
$data= base64_encode($encrypt_data);
return $data;
}
```
解密
```php
public function apiDecrypt($data)
{
$key = $this->initParams['aes_key'];
$iv = $this->initParams['aes_iv'];
$data= base64_decode($data);
$decryptData = openssl_decrypt($data, "aes-128-cbc",$key,OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv);
$decryptData = str_replace("\0","",$decryptData);
$data= json_decode($decryptData,true);
return $data;
}
```