abnermouke/supports
  • 前言
  • 框架使用
    • Laravel
    • Hyperf
  • 目录结构
  • 常用数据 data
  • 辅助方法 helpers
  • 主要功能 src
    • 辅助类 Assists
      • 文件辅助类 File
      • 框架辅助类 Framework
      • 数组辅助类 Arr
      • 路径辅助类 Path
      • 字符串辅助类
    • 功能藏库 Library
      • 违禁词筛选 SensitiveFilterLibrary
      • 常用验证 ValidateLibrary
      • 辅助方法 HelperLibrary
      • 逻辑状态码 CodeLibrary
      • 设备判断 DeviceLibrary
      • 虚假UA FakeUserAgentLibrary
      • 日志记录 LoggerLibrary
      • 图片处理 PictureLibrary
      • 二维码处理 QrLibrary
      • 加解密
        • Aes加解密 AesLibrary
        • 验签加解密 SignLibrary
Powered by GitBook
On this page
  • 加密调用方法
  • 解密调用方法(验证签名)
  1. 主要功能 src
  2. 功能藏库 Library
  3. 加解密

验签加解密 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__是否已过期。

PreviousAes加解密 AesLibrary

Last updated 2 years ago