验签加解密 SignLibrary

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

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

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

加密调用方法

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

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

__signature__:加密后的签名 __timestamp__:加密时时间戳(用于判断签名实效性,默认60秒,验证时也可自定义) __nonceStr__:加密随机字符串(用于区分签名唯一性)

签名流程

  1. 筛选并排序

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

  1. 拼接

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

  1. 生成签名

  • 将拼接字符串追加__timestamp__、__nonceStr__参数后使用key、secret进行拼接加密,生成__signarure__

  1. 把生成的__timestamp__、__nonceStr__、__signature__追加到请求参数中。

解密调用方法(验证签名)

Abnermouke\Supports\Library\Cryptography\SignLibrary::make($key, $secret)->verify($query_body, $expire_second = 60)

签名验证时将暂时剔除参数中__timestamp__、__nonceStr__、__signature__三个字段,同时将其他参数按正常签名流程生成签名。

验签流程

  1. 剔除字段

  • 获取所有请求参数,剔除__timestamp__、__nonceStr__、__signature__三个字段

  1. 拼接

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

  1. 生成签名

  • 将拼接字符串追加__timestamp__、__nonceStr__参数后使用key、secret进行拼接加密,生成__signarure__

  1. 验证生成的签名与请求参数中的__signature__是否一致。

  2. 判断请求参数中的__timestamp__是否已过期。

Last updated