一文搞懂接口参数签名与验签(附含java python php版)

 更新时间:2023年06月12日 10:23:39   作者:波波  
这篇文章主要为大家介绍了java python php不同版的接口参数签名与验签示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

随着前后端分离的开发模式的发展,接口安全显得越来越重要。我们通常的做法是为接口的请求参数进行加密,也就是我们常说的“签名与验签”。希望本篇笔记能帮助部分需要的小伙伴们。

说在前面:安全的方法不能局限于此!!!本篇笔记仅供参考学习。

签名步骤

既然要签名(加密),那么我们一定要有自己的加密方法。以下为示例的加密步骤。

  • 将所有的参数进行字典排序;
  • 将排序后的数组key与value用“&”符号连接。生成类似Get请求的参数格式。如:tel=15588888888&passwd=123456×tamp=165031031
  • 将第二步生成的字符串参数进行MD5加密;
  • 将第三步生成的签名转换为大写;

签名方法(PHP版)

/**
 * Sign签名方法
 * @param array $param 待签名的参数
 * @param string $key 请求方Key
 * @return string 签名
 * @throws \think\Exception
 */
function generateToken(array $param,string $key=''):string{
    if(emptyempty($param)) throw new \think\Exception('参数不能为空');
    ksort($param);
    if (isset($param['sign'])) unset($param['sign']);
    foreach ($param as $k => $v) {
        if ('' === $v || null === $v) continue;
        $buff .= "{$k}={$v}&";
    }
    $buff .= ("key=" . $key);
    return strtoupper(md5($buff));
}

参数说明:

  • $param 请求主体参数,数组形式,不包含Key;
  • $key 为了安全起见建议将Key放在请求的Header部分,具体键值双方约定即可,常见的是放入Hrader部分的AuthorizationApp-Key等;

签名验证

签名的验证非常简单,只需一行代码判断请求体中的Sign签名与签名结果是否一致即可。示例如下:

  • var_dump($param['sign'] == generateToken($param,$key));
  • //返回布尔类型true或false

其他语言拓展:

1、Java版签名加密方法

import java.util.Map;
import java.util.TreeMap;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class SignUtil {
  /**
   * Sign签名方法
   *
   * @param param 待签名的参数
   * @param key 请求方Key
   * @return 签名
   * @throws Exception
   */
  public static String generateToken(Map<String, String> param, String key) throws Exception {
    if (param.isEmpty()) {
      throw new Exception("参数不能为空");
    }
    // 将参数按照ASCII码从小到大排序
    Map<String, String> sortedParam = new TreeMap<>(param);
    // 拼接参数
    StringBuilder sb = new StringBuilder();
    for (Map.Entry<String, String> entry : sortedParam.entrySet()) {
      String k = entry.getKey();
      String v = entry.getValue();
      if (v != null && !v.equals("")) {
        sb.append(k).append("=").append(v).append("&");
      }
    }
    sb.append("key=").append(key);
    // 计算MD5签名
    return getMD5(sb.toString()).toUpperCase();
  }
  /**
   * 计算MD5签名
   *
   * @param str 待签名的原始字符串
   * @return MD5签名
   * @throws NoSuchAlgorithmException
   */
  private static String getMD5(String str) throws NoSuchAlgorithmException {
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] bytes = md.digest(str.getBytes());
    StringBuilder sb = new StringBuilder();
    for (byte b : bytes) {
      String hex = Integer.toHexString(b & 0xff);
      if (hex.length() == 1) {
        sb.append("0");
      }
      sb.append(hex);
    }
    return sb.toString();
  }
}

2、Python版签名加密方法

import hashlib
def generateToken(param: dict, key: str) -> str:
    if not param:
        raise Exception('参数不能为空')
    # 将参数按照ASCII码从小到大排序
    sortedParam = dict(sorted(param.items()))
    # 拼接参数
    buff = ''
    for k, v in sortedParam.items():
        if v is not None and v != '':
            buff += f'{k}={v}&'
    buff += f'key={key}'
    # 计算MD5签名
    return hashlib.md5(buff.encode('utf-8')).hexdigest().upper()

以上就是一文搞懂接口参数签名与验签(附含java python php版)的详细内容,更多关于接口参数签名验签的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot3集成Kafka的方法详解

    SpringBoot3集成Kafka的方法详解

    Kafka是一个开源的分布式事件流平台,常被用于高性能数据管道、流分析、数据集成和关键任务应用,下面我们就来看看SpringBoot3是如何集成Kafka的吧
    2023-08-08
  • JavaCV实现获取视频每帧并保存

    JavaCV实现获取视频每帧并保存

    这篇文章主要为大家详细介绍了JavaCV实现获取视频每帧并保存,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • MyBatis多数据源的两种配置方式

    MyBatis多数据源的两种配置方式

    这篇文章主要给大家介绍了关于MyBatis多数据源的两种配置方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • spring boot入门开始你的第一个应用

    spring boot入门开始你的第一个应用

    这篇文章主要介绍了spring boot入门开始你的第一个应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • Java 如何使用Velocity引擎生成代码

    Java 如何使用Velocity引擎生成代码

    代码生成器,可以有效减少编写重复代码,快速实现简单的业务逻辑,也能让我们的代码保持一致。那目前,我们看到的代码生成器,大部分是基于velocity引擎模板生成的,接下来我们就学习一下如何实现代码生成器。
    2021-06-06
  • java实现滑动验证解锁

    java实现滑动验证解锁

    这篇文章主要为大家详细介绍了java实现滑动验证解锁,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • SpringBoot大事务问题的常用优化方案

    SpringBoot大事务问题的常用优化方案

    大事务是指运行时间比较长,操作的数据比较多的事务123,大事务的产生原因包括操作的数据比较多、大量的锁竞争、事务中有其他非数据库的耗时操作等,本文给大家总结了SpringBoot大事务问题的常用优化方案,需要的朋友可以参考下
    2024-04-04
  • Mybatis映射文件详解之mapper.xml文件

    Mybatis映射文件详解之mapper.xml文件

    本文详细介绍了Mybatis映射文件的结构、标签和使用方法,包括mapper元素、标签的主要属性如id、parameterType、resultType以及动态SQL和结果映射的使用,通过映射文件,可以将数据库表与Java对象映射,支持查询、插入、更新、删除等操作,提高了SQL语句的灵活性和可重用性
    2024-09-09
  • Java8中的Stream流式操作教程之王者归来

    Java8中的Stream流式操作教程之王者归来

    这篇文章主要给大家介绍了关于Java8中Stream流式操作的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Java 多层嵌套JSON类型数据全面解析

    Java 多层嵌套JSON类型数据全面解析

    这篇文章主要介绍了Java 多层嵌套JSON类型数据全面解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01

最新评论