首页 > 其他分享 >在做api开发时,签名验证怎么设计?

在做api开发时,签名验证怎么设计?

时间:2024-05-28 16:36:45浏览次数:22  
标签:验证 sign api 参数 签名 字符串 data

开发过程中,我们经常会与接口打交道,有的时候是调用别人网站的接口,有的时候是为了他人提供自己网站的接口,但是在调用去过程离不开签名验证。

设计签名验证的时候,需要注意以下几点:

1.可变性:每次的签名必须是不一样的。

2.时效性:每次请求的时效,过期作废等

3.唯一性:每次的签名是唯一的

4.完整性:能够对传入的数据进行验证,防止篡改

 

这里介绍一种方式:

一,签名参数sign生成的方法

第1步:将所有参数(注意是所有参数),出去sign本身,以及值是空的参数,按照参数名字母升序排序。

第2步:然后把排序后的参数按参数1值1参数2值2.....参数n值n(这里的参数和值必须是传输参数的原始值,不能是经过处理的,如不能将转成后再拼接)的方式拼接成一个字符串。

第3步:把分配给接入方的验证秘钥key拼接在第2步得到的字符串的前面

第4步:在上一步得到的字符串前面加上验证秘钥key,然后计算md5值,得到32位字符串,然后转成大写。

第5步:计算第4步字符串的md5值(32位),然后转为大写,得到的字符作为sign的值

 

举例:

假设传输的数据是/iinterface.php?sign=sign_value&p2=v2&p1=v1$method=cancel&p3=&pn=vn(实际情况最好是通过post方式传递),其中sign参数对应的sing_value就是签名的值。

第一步,拼接字符串,首先去除sign参数本身,然后去除值是空的参数p3,剩下p2=v2&p1=v1&method=cancel& amp;pn=vn,然后按参数名字符升序排序,method=cancel&p1=v1&p2=v2&pn=vn.

第二步,然后做参数名和值的拼接,最后得到methodcancelp1v1p2v2pnvn

第三步,在上面拼接得到的字符串前加上验证密钥key,我们假设是abc,得到新的字符串abcmethodcancelp1v1p2v2pnvn

第四步,然后将这个字符串进行md5计算,假设得到的是abcdef,然后转为大写,得到ABCDEF这个值即为sign签名值。

注意,计算md5之前请确保接口与接入方的字符串编码一致,如统一使用utf-8编码或者GBK编码,如果编码方式不一致则计算出来的签名会校验失败。‘

二、签名验证方法:

根据前面描述的签名参数sign生成的方法规则,计算得到参数的签名值,和参数中传递过来sign对应的参数值进行对比,如果是一致就校验通过,说明参数没有被修改过。

三、下面直接看代码

<?php

// 设置一个公钥(key)和私钥(secret),公钥用于区分用户,私钥加密数据,不能公开
$key = "c4ca4238a0b923820dcc509a6f75849b";
$secret = "28c8edde3d61a0411511d3b1866f0636";

// 待发送的数据包
$data = array(
    'username' => '[email protected]',
    'sex' => '1',
    'age' => '16',
    'addr' => 'guangzhou',
    'key' => $key,
    'timestamp' => time(),
);

// 获取sign
function getSign($secret, $data) {
    // 对数组的值按key排序
    ksort($data);
   // 生成url的形式 $params = http_build_query($data); //http_build_query() // 生成sign $sign = md5($params . $secret); //md5() return $sign; } // 发送的数据加上sign $data['sign'] = getSign($secret, $data); /** * 后台验证sign是否合法 * @param [type] $secret [description] * @param [type] $data [description] * @return [type] [description] */ function verifySign($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('请求不合法'); } }

  

 

标签:验证,sign,api,参数,签名,字符串,data
From: https://www.cnblogs.com/feixiablog/p/18218315

相关文章

  • Jakarta Bean Validation 规范介绍及其API使用以及与Spring Validator之间的关系
    JakartaBeanValidation规范1.BeanValidation的前世今生BeanValidation规范最早在OracleJavaEE下维护。2017年11月,Oracle将JavaEE移交给Eclipse基金会。2018年3月5日,Eclipse基金会宣布JavaEE(EnterpriseEdition)被更名为JakartaEE。随着JSR-303......
  • 干货分享:Vue 3和TypeScript结合进行API封装
    前言:  在现代的前端开发中,使用Vue3和TypeScript结合进行API封装已经成为一种流行的实践。通过将Vue3的响应式性与TypeScript的静态类型检查相结合,我们可以更加安全和高效地管理和使用接口请求。本文将介绍如何在Vue3项目中使用TypeScript进行API封装,以提高代码质量、可......
  • Nginx(openresty) 通过lua结合Web前端 实现图片,文件,视频等静态资源 访问权限验证,进行
    1本文系统环境:安装openresty(nginx),可参考:test@ubuntuserver:~$cat/etc/os-releasePRETTY_NAME="Ubuntu24.04LTS"NAME="Ubuntu"VERSION_ID="24.04"VERSION="24.04LTS(NobleNumbat)"VERSION_CODENAME=nobleID=ubuntuID_LIK......
  • .net core的WebAPI+Vue2实现调用设备拍照上传图片功能
    在工作中有时候会遇到上传文件上传图片或者拍照上传图片功能。这时候底下的内容就有可能可以帮助到你。后端的支持上传图片和上传文件功能。前端如果你选择普通上传功能就是普通上传功能,我这里选择的是调用相机设备实现拍照上传图片功能。1.首先这是后端的控制器接口。1///<......
  • 效率翻倍!超好用的AI+写作API接口汇总
    在过去几年里,人工智能(AI)技术经过众多科技公司和科研人员的不懈努力取得了巨大进步,吸引了大众的广泛关注。这些AI技术在应用领域的新闻报道也逐渐走入人们的视野,引发了对其具体应用的浓厚兴趣。今天,我们将聊一聊AI与写作文案的结合。在传统观念中,AI技术通常被限制在有明确定义任务......
  • claude3国内API接口对接
    众所周知,由于地理位置原因,Claude3不对国内开放,而国内的镜像网站使用又贵的离谱!因此,团队萌生了一个想法:为什么不创建一个一站式的平台,让用户能够通过单一的接口与多个模型交流呢?这样,用户就可以轻松地比较不同模型的表现,并根据需要选择最合适的一个。于是诞生了这个ChatGPT,Claude3......
  • 掌握Postman,开启API测试新纪元!
    Postman是一款流行的API测试工具和开发环境,旨在简化API开发过程、测试和文档编制。它提供了一套功能强大的工具,帮助开发人员更轻松地构建、测试和调试Web服务。Postman工具的优势****Postman可以快速构建请求、还可以保存以后再使用。Postman还提供响应结果的比较功能,可以......
  • APIO 2024
    A-September模拟题。取出\(m\)个人里包含相同元素的段,再判断删掉的是不是都是叶子就好,时间复杂度\(O(nm)\)#include<bits/stdc++.h>usingnamespacestd;intsolve(intn,intm,vector<int>fa,vector<vector<int>>s){ intans=0,cnt=0; vector<int>d(......
  • 使用Windows API进行GDI窗口绘图
    1.概述在Windows上绘图方式,跟美术大师绘图差不多。美术绘画,首先要具备以下工具:画板,画布,画笔,画刷。同样,Windows上也有相关的概念。绘图设备DeviceContext(DC),位图Bitmap,画笔Pen,画刷brush。他们一一对应。2.画板在Windows中被称作设备上下文(DeviceContext,DC),我习惯称之为绘图设备。......
  • 淘宝订单信息获取接口API,淘宝打单发货接口
    从事电商软件开发的小伙伴,在日常开发任务中,经常会遇到一个需求,就是将淘宝店铺的订单,同步到自己的内部订单管理系统OMS中,进行淘宝打单发货操作。我介绍下如何将订单同步下来,供各位参考。(注意:所有电商平台目前能同步订单的接口要么就不让申请,要么就申请门槛和维护资质的成本很高,具体......