> For the complete documentation index, see [llms.txt](https://abnermouke.gitbook.io/abnermouke-supports/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://abnermouke.gitbook.io/abnermouke-supports/zhu-yao-gong-neng-src/gong-neng-cang-ku-library/jia-jie-mi/yan-qian-jia-jie-mi-signlibrary.md).

# 验签加解密 SignLibrary

验签加解密为明文传输，原加密参数依旧会暴露，建议使用AES进行二次加密，暗文传输更安全。

验签加密核心目的在于杜绝参数篡改，正常情况下，接口文档中的链接只要参数与链接正确即可爬取获取接口数据，为避免恶意爬取，可针对请求参数进行签名认证，即将请求参数根据指定方式排列后进行加密，服务端需通过同样方式解密无误后方才返回正常的响应数据，否则将一律视为非法请求。

验签加解密需准备 Key 和 Secret，长度随机。

## 加密调用方法

**Abnermouke\Supports\Library\Cryptography\SignLibrary::make($key, $secret)->create($query\_body)**

加密后系统将自动在原参数中添加以下参数：

\_\_signature\_\_：加密后的签名\
\_\_timestamp\_\_：加密时时间戳（用于判断签名实效性，默认60秒，验证时也可自定义）\
\_\_nonceStr\_\_：加密随机字符串（用于区分签名唯一性）

**签名流程**

1. 筛选并排序

* 获取所有请求参数，不包括字节类型参数，如文件、字节流，剔除值为空的参数，并按照第一个字符的键值ASCII码递增排序（字母升序排序），如果遇到相同字符则按照第二个字符的键值ASCII码递增排序，以此类推。

2. 拼接

* 将排序后的参数与其对应值，组合&#x6210;**“参数=参数值”**&#x7684;格式，并且把这些参数&#x7528;**“&”**&#x5B57;符连接起来，此时生成的字符串为待签名字符串，K1=V1\&K2=V2，所有参数值将进行rawurlencode处理，避免传输过程中被系统更改。

3. 生成签名

* 将拼接字符串追加\_\_timestamp\_\_、\_\_nonceStr\_\_参数后使用key、secret进行拼接加密，生成\_\_signarure\_\_

4. 把生成的\_\_timestamp\_\_、\_\_nonceStr\_\_、\_\_signature\_\_追加到请求参数中。

## **解密调用方法（验证签名）**

**Abnermouke\Supports\Library\Cryptography\SignLibrary::make($key, $secret)->verify($query\_body, $expire\_second = 60)**

签名验证时将暂时剔除参数中\_\_timestamp\_\_、\_\_nonceStr\_\_、\_\_signature\_\_三个字段，同时将其他参数按正常签名流程生成签名。

**验签流程**

1. 剔除字段

* 获取所有请求参数，剔除\_\_timestamp\_\_、\_\_nonceStr\_\_、\_\_signature\_\_三个字段

2. 拼接

* 将排序后的参数与其对应值，组合&#x6210;**“参数=参数值”**&#x7684;格式，并且把这些参数&#x7528;**“&”**&#x5B57;符连接起来，此时生成的字符串为待签名字符串，K1=V1\&K2=V2，所有参数值将进行rawurlencode处理，避免传输过程中被系统更改。

3. 生成签名

* 将拼接字符串追加\_\_timestamp\_\_、\_\_nonceStr\_\_参数后使用key、secret进行拼接加密，生成\_\_signarure\_\_

4. 验证生成的签名与请求参数中的\_\_signature\_\_是否一致。
5. 判断请求参数中的\_\_timestamp\_\_是否已过期。
