如何给API签名

前言

有时候为了保护API,需要用到 API 签名,使用 API 签名的好处:

  • 让API只能被特定的人访问
  • 防止别人抓包拿到请求参数,通过篡改参数发起新的请求

客户端过程

  1. 给API调用者分配一个app_idapp_secretapp_secret调用者和服务端各保存一份,不对外泄露,app_id需要在调用 API 时作为参数传递。
  2. 除了app_id参数以外,另外增加noncetimestamp参数。timestamp是时间戳,nonce是一个随机字符串,每次调用API时都要重新生成,且需要保证唯一性。这两个参数主要用来防止重复请求。
  3. 将参数列表按字典升序排列,然后在末尾添加上app_secret参数,将参数列表拼接成一个字符串,对字符串做md5加密,得到signature签名,最后将签名也传递给API。

将参数列表拼接成字符串,可以有多种实现方法,在本文中我们使用这种方案:
1)将参数列表进行排序,按key字典升序排列
2)在末尾添加上app_secret参数
3)按key1=value1&key2=value2&key3=value3的格式,将参数列表拼接成一个字符串,其中value值要经过url编码处理
4)拼接完成后,做md5运算,生成散列值,此值便是签名

服务端过程

  1. 收到请求后,按照app_id参数查询到对应的app_secret
  2. 判断timestamp参数是否已过期
  3. 判断nonce参数是否已经被使用
  4. 剔除sign参数,将其它参数按照约定的签名计算方法,生成一个签名A,将签名Asign参数进行对比,如果一致则通过
  5. nonce参数标记为已使用(可以使用redis来存储,并设置过期时间)

注:
1)时间戳的超时时间不能设置得太小,需要考虑服务端和客户端时间可能会有时差的情况,推荐设置为5分钟
2)对于nonce参数,redis key的过期时间一定要大于时间戳的过期时间,比如时间戳过期时间是5分钟,那么redis key的过期时间就要 >= 5分钟

PHP代码示例

client.php

<?phpfunction genSignature(array $signArr, $appSecret): string
{ksort($signArr, SORT_STRING);$signArr['app_secret'] = $appSecret;$signStr = http_build_query($signArr);return md5($signStr);
}function buildParams(array $params): array
{$appId = 'xxxx';$appSecret = 'yyyy';$params['app_id'] = $appId;$params['nonce'] = uniqid('', true);$params['timestamp'] = time();$params['sign'] = genSignature($params, $appSecret);return $params;
}$params = ['username' => '小明','gender' => '男',
];
var_dump(buildParams($params));// TODO:使用生成的参数调用API接口

server.php

<?phpfunction signatureVerify(array $signArr, $appSecret): string
{unset($signArr['sign']);ksort($signArr, SORT_STRING);$signArr['app_secret'] = $appSecret;$signStr = http_build_query($signArr);return md5($signStr);
}$params = $_GET;$appId = $params['app_id'];
// TODO:根据app_id参数查找对应的app_secret
$appSecret = 'yyyy';$mySign = signatureVerify($params, $appSecret);
if ($mySign === $params['sign']) {echo '签名验证成功';
} else {echo '签名验证失败';
}// TODO:检查timestamp是否已过期
// TODO:检查nonce是否已被使用过
// TODO:将nonce存储到redis,并设置key的过期时间

关于app_secret的安全性

在上述整个过程中,最重要的是保证app_secret不外泄,如果app_secret外泄了,其他人就可以用它来生成签名。

但真实情况下,我们很难保证app_secret不外泄,如果客户端是server端还好说,但如果客户端是浏览器的话,由于网页代码都是可以被看到的,所以只要查看一遍网页的js代码,就可以找到app_secret

如果客户端是安卓APP,别人也可以通过拆解apk安装包,破解拿到app_secret

面对这种情况也没有完美的方法,毕竟源代码都被别人看到了,还能有啥安全可言。只能通过js代码混淆、apk包安全加固等方法来提高别人找到app_secret的难度。

加密

虽然我们给接口加了签名验证,但别人还是可以通过浏览器的开发者工具、或者抓包看到具体传递的参数名和参数值。

如果不想别人看到这些信息的话,可以将参数都加密,加密方法可以使用RSA加密(使用服务端公钥加密,服务端收到请求后使用私钥解密)、或者AES加密。

加密后,别人抓包看到的就都是密文了,可以提高别人破解接口的难度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【基于Thread多线程+随机数(Random)+java版本JDBC手动提交事务+EasyExcel读取excel文件,向数据库生成百万级别模拟数据】

基于Thread多线程随机数&#xff08;Random&#xff09;java版本JDBC手动提交事务EasyExcel读取excel文件&#xff0c;向数据库生成百万级别模拟数据 基于Thread多线程随机数&#xff08;Random&#xff09;java版本JDBC手动提交事务EasyExcel读取excel文件&#xff0c;向数据库…

《动手学深度学习》(pytorch版+mxnet版)2023最新

我又来推书了&#xff0c;这次分享的这本书可是重量级&#xff0c;目前已经被55个国家300所大学用于教学&#xff0c;同时受到了学术界与工业界的强烈推荐。 这本书就是李沐、阿斯顿张、立顿、斯莫拉四位大佬联合编写的《动手学深度学习》。本书面向中文读者&#xff0c;能运行…

【uniapp+vue3 】页面加载时根据不同角色设置导航栏标题

uniapp 页面加载时根据不同角色设置导航栏标题 其实很好实现&#xff0c;第一次开发uniapp项目&#xff0c;所以什么都不懂&#xff0c;绕了一点点的弯路 在对应页面的onLoad中获取到跳转过来传的参数中的判断角色字段&#xff0c;我这里传的是getRole uni.setNavigationBarT…

2024携程校招面试真题汇总及其解答(二)

6.画一下浮点数的结构 浮点数的结构主要由以下几个部分组成: 符号位:用于表示浮点数的正负,0 表示正,1 表示负。指数位:用于表示浮点数的大小,0 表示 1,1 表示 2,以此类推。尾数位:用于表示浮点数的具体值,尾数位通常使用科学计数法来表示。以下是浮点数的结构图: …

基于SSM的旅游网站系统

基于SSM的旅游网站系统【附源码文档】、前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1a;管理员、用户 管理员&#xff1a;用户管理、景点…

6. N 字形变换

https://leetcode.cn/problems/zigzag-conversion/description/ 思路 找规律&#xff1a; 首尾两行的下标是一个以i为第一个元素&#xff0c;2n-2为公差的等差数列中间元素的奇数元素是一个以i为第一个元素&#xff0c;2n-2为公差的等差数列 偶数元素是一个以2n-i-2为第一个…

避免分库分表,绿普惠的分布式数据库选型与实践

作者&#xff1a;翻墨&#xff0c;绿普惠科技&#xff08;北京&#xff09;有限公司架构师 一项数据显示&#xff0c;今天大气中的二氧化碳水平比过去 65 万年高了 27%。主要原因来自于工业化需求下的煤炭燃烧、汽车尾气。随着人类活动造成的温室效应加剧&#xff0c;环保越来越…

前端中blob文件流和base64的区别

在前端中&#xff0c;base64 和 fileBlob 是用于处理文件数据的两种不同方式。 1. Base64 编码 Base64 是一种将二进制数据转换为文本字符串的编码方式。它将文件数据转换为一串由 ASCII 字符组成的字符串。在前端中&#xff0c;可以使用 JavaScript 的 btoa() 和 atob() 函数…

uni-app 点击蒙版层时关闭自定义弹窗

click.stop&#xff1a;用于阻止冒泡 click.stop 标签范围内&#xff0c;点击任何区域(包括 click 点击事件)都不会关闭弹窗。标签范围外会关闭弹窗 click.stop 标签内的 click 等事件&#xff1a;如果事件内有关闭弹窗的代码可关闭弹窗 在 template 中 <view class&quo…

MyBatis注解开发

MyBatis常用注解 注解对应XML说明Insert< insert>新增SQLUpdate< update>更新SQLDelete< delete>删除SQLSelect< select>查询SQLParam–参数映射Results< resultMap>结果映射Result< id>< result>字段映射 开发流程&#xff1a; 1…

Milvus+Attu

Milvus 1.下载 https://github.com/milvus-io/milvus/releases/下载milvus-standalone-docker-compose version: 3.5services:etcd:container_name: milvus-etcdimage: quay.io/coreos/etcd:v3.5.5environment:- ETCD_AUTO_COMPACTION_MODErevision- ETCD_AUTO_COMPACTION_R…

小程序开发一个多少钱啊

在今天的数字化时代&#xff0c;小程序已经成为一种非常流行的应用程序形式。由于它们的便捷性、易用性和多功能性&#xff0c;小程序吸引了越来越多的用户和企业。但是&#xff0c;很多人在考虑开发一个小程序时&#xff0c;都会遇到同一个问题&#xff1a;开发一个小程序需要…

JavaWeb基础学习(5)

JavaWeb基础学习 一、Filter1.1 Filter介绍1.2 Filter快速入门1.3、Filter执行流程1.4、Filter使用细节1.5、Filter-案例-登陆验证 二、Listener2.1 Listener介绍2.2、ServletContextListener使用 三、AJAX3.1 AJAX介绍与概念3.2 AJAX快速入门3.3 Axios异步架构3.4 JSON-概述和…

C#__使用流读取和写入数据的简单用法

使用流处理数据的优势&#xff1a;可以一次性搬运数据量大的文件&#xff0c;把数据当做水&#xff0c;一点一点搬运。 数据的传输方向&#xff1a;从外部源传输到程序&#xff08;读取流&#xff09;&#xff1b;从程序传输到外部源&#xff08;读入流&#xff09; …

腾讯mini项目-【指标监控服务重构】2023-08-18

今日已办 watermill 将 key 设置到 message 中 修改 watermill-kafka 源码 将 key 设置到 message.metadata中 接入 otel-sdk 添加 middleware resolveUpstreamCtx 解析上游上下文&#xff0c;开启根Span添加 middleware middleware.InstantAck - 马上ACK&#xff0c;使得多…

面试Java后端

sql 五表联合查询 面试八股 JDK&#xff0c;JRE,JVM之间的区别 JDK&#xff0c;Java标准开发包&#xff0c;它提供了编译、运行Java程序所需的各种工具和资源&#xff0c;包括Java编译器、Java运行时环境&#xff0c;以及常用的Java类库等。 JRE(Java Runtime Environment)&…

Learn Prompt-Prompt 高级技巧:AI-town 虚拟小镇

AI-town可能是2023年最令人鼓舞的AI代理实验之一。我们经常讨论单个LLM的突现能力&#xff0c;但 Agents 突现在大规模下可能会更复杂和迷人。一个AI的种群可以展现出整个文明的演化。 &#x1f389;开始阅读前&#xff0c;如果你对其他文章感兴趣&#xff0c;可以到欢迎页关注…

Anaconda下载安装教程,新手详细

Anaconda的安装包下载分为官网下载和清华源下载&#xff0c; ①官网&#xff1a;Anaconda官网 &#xff08;别的博主说官网较慢&#xff0c;有时候还进不去&#xff0c;我感觉还行&#xff0c;2分钟就下载好了。如果不顺利&#xff0c;请尝试使用清华源&#xff09; ②清华源…

机器学习入门教学——损失函数(极大似然估计法)

1、前言 我们在训练神经网络时&#xff0c;最常用到的方法就是梯度下降法。在了解梯度下降法前&#xff0c;我们需要了解什么是损失(代价)函数。所谓求的梯度&#xff0c;就是损失函数的梯度。如果不知道什么是梯度下降的&#xff0c;可以看一下这篇文章&#xff1a;机器学习入…

性能测试 —— Tomcat监控与调优:status页监控

Tomcat服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;Tomcat是Apache 软件基金会(Apache Software Foundation)Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun 和其他一些公司及个人共同开发而成。 Tomcat是一个轻量级应用服务器&#xff0c;在中小型系统…