php 签名验证apikey

<?php

// 获取sign(客户端的通过私钥签名)
function getSign($secret,$array) {
    ksort($array);
    $requestString = '';
    foreach ($array as $k => $v) {
        if(!is_array($v)){
            $requestString .= $k . '=' . $v;
        }
    }
    $requestString = strtolower($requestString);
    $newSign = hash_hmac('sha256', $requestString, $secret);
    return $newSign;  //返回得到的签名
}


//后台验证,签名是否是否一致
function verifySign($secret, $data) {
    // 验证参数中是否有签名
    if (!isset($data['sign']) || !$data['sign']) {
        return '发送的数据签名不存在';
    }
    if (!isset($data['timestamp']) || !$data['timestamp']) {
        return '发送的数据参数不合法';
    }
    // 验证请求, 10分钟失效
    if (time() - $data['timestamp'] > 600) {
//        return '验证失效, 请重新发送请求';
    }
    $sign = $data['sign'];
    unset($data['sign']);
    ksort($data);
    $params = '';
    foreach ($data as $k => $v) {
        if(!is_array($v)){
            $params .= $k . '=' . $v;
        }
    }
    $params = strtolower($params);
   
    // $secret是通过key在api的数据库中查询得到
    $newSign = hash_hmac('sha256', $params, $secret);
    if ($sign == $newSign) {
        return '验证通过';
    } else {
        return '请求不合法';
    }
}


$secret = "73c887dc2c20d5cefe"; //私钥,要保持到数据库中的  
$data = array(
    "publicKey" => "690d996f59d6ef192",  //公钥 用来的查询对应数据库的私钥
    "username" => "token123",
    "password" => "www123123",
    "sex" => "1",
    "addr" => "zhongguo",
    "timestamp" => "1570690257",
);

//先通过publicKey 去数据库中找到secret (私钥) ,这里我就直接定义到这里了

$data['sign']=getSign($secret, $data);   //data 通过私钥得到一个签名,把这个签名加入data 然后去验证码签名是否一致 如果一致表示ok 
//echo $data['sign'].PHP_EOL;

$info=verifySign($secret,$data);
var_dump($info);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
API接口签名验证可以确保请求的来源是可信的,并且请求参数没有被篡改。以下是一个PHP实现API接口签名验证的示例: 1. 客户端发送请求时,将参数按照参数名进行字典排序,并将参数名和参数值用等号连接起来,每个键值对之间用&符号连接起来,得到待签名字符串。 2. 将待签名字符串和应用程序的appsecret进行拼接,然后通过哈希算法(如SHA1或MD5)计算得到签名值。 3. 将签名值作为参数(通常是sign或signature)添加到原有的请求参数中,然后发送请求。 4. 服务器接收到请求后,按照同样的方式计算签名,将计算出的签名值与请求中的签名值进行比对,如果一致则认为请求合法,否则认为请求不合法。 以下是一个简单的示例代码: ```php <?php // 定义应用程序的appsecret $appsecret = "your_app_secret"; // 获取请求参数 $params = $_POST; // 按照参数名进行字典排序 ksort($params); // 将参数名和参数值用等号连接起来,每个键值对之间用&符号连接起来,得到待签名字符串 $sign_str = ""; foreach ($params as $key => $value) { $sign_str .= $key . "=" . $value . "&"; } $sign_str .= "appsecret=" . $appsecret; // 计算签名值 $sign = md5($sign_str); // 验证签名 if ($sign != $params['sign']) { // 签名验证失败 echo "Invalid Signature"; } else { // 签名验证成功 // 执行业务逻辑 } ?> ``` 在实际应用中,为了增加安全性,可以使用更加复杂的签名算法,如RSA数字签名等。另外,还可以限制请求的时间戳和nonce值,防止重放攻击。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值