<?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);
php 签名验证apikey
最新推荐文章于 2022-04-15 09:44:29 发布