PHP 开发API接口签名生成以及验证
开发过程中,我们经常会与接口打交道,有的时候是调取别人网站的接口,有的时候是为他人提供自己网站的接口,但是在这调取的过程中都离不开签名验证。
我们在设计签名验证的时候,请注意要满足以下几点:
可变性:每次的签名必须是不一样的。
时效性:每次请求的时效,过期作废等。
唯一性:每次的签名是唯一的。
完整性:能够对传入数据进行验证,防止篡改。
<?php // 设置一个公钥(key)和私钥(secret),公钥用于区分用户,私钥加密数据,不能公开 $key = "c4ca4238a0b923820dcc509a6f75849b"; $secret = "28c8edde3d61a0411511d3b1866f0636"; // 待发送的数据包 $data = array( 'username' => 'abc@qq.com', 'sex' => '1', 'age' => '16', 'addr' => 'guangzhou', 'key' => $key, 'timestamp' => time(), ); // 获取 sign function getSign(secret,secret,data) { // 对数组的值按 key 排序 ksort($data);// 生成 url 的形式 $params = http_build_query($data);// 生成 sign $sign = md5($params . $secret); return $sign; } // 发送的数据加上 sign data['sign'] = getSign(data[′sign′]=getSign(secret, $data);
/** 后台验证 sign 是否合法 @param [type] $secret [description] @param [type] $data [description] @return [type] [description] */ function verifySign(secret,secret,data) { // 验证参数中是否有签名 if (!isset($data['sign']) || !$data['sign']) { echo '发送的数据签名不存在'; die(); }if (!isset($data['timestamp']) || !$data['timestamp']) { echo '发送的数据参数不合法'; die(); } // 验证请求, 10 分钟失效 if (time() - $data['timestamp'] > 600) { echo '验证失效, 请重新发送请求'; die(); } $sign = $data['sign'];unset($data['sign']); ksort($data); $params = http_build_query($data);// $secret 是通过 key 在 api 的数据库中查询得到 $sign2 = md5($params . $secret); if ($sign == $sign2) { die('验证通过'); } else { die('请求不合法'); } } ?>
♥ 作者:离岸少年
♠ 出处:https://www.cnblogs.com/jackzhuo/
♣ 本博客大多为学习笔记或读书笔记,本文如对您有帮助,还请多推荐下此文,如有错误欢迎指正,相互学习,共同进步。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理