PHP语言, API接口设计数据安全,通过 hash_hmac对数据进行加解密,

 
    private function getSecuKey(){
        $siteflag  = $this->request->header('siteflag',false);
        $secukey=false;
        if($siteflag){
            $key='site.'.$siteflag;
            $secukey = Env::get($key);
        }
        if($secukey && $secukey!=''){}else{
          $this->error('NoRight');
        }
        return $secukey;
    }
 
    //发送前 数据处理 加密
    private function hmacsign($arr){
        $json=json_encode($arr,JSON_UNESCAPED_UNICODE);
        $base64=base64_encode($json);
        $base64_r= strrev($base64);//倒序
        $base64_r = str_replace(['='],['--'],$base64_r);
        $chang=mt_rand(1,9);
        $base64_r = mt_rand(111,999).$chang.substr(str_shuffle('z-a-q-w-s-x-c-d-e-r-f-v-b-g-t-y-h-n-m-j-u-k-i-l-o-p-'),0,$chang).$base64_r;
        $secukey="mkoi54345jk03r34kr23erk20239";
        $sign = hash_hmac('sha256',$base64_r,$secukey);
        $r=['data'=>$base64_r,'sign'=>$sign];
        return $r;
    }
 
    //接受到数据后, 验证并解密
    private function dedatasign($arr){
        $data=$arr['data'];
        $sign = $arr['sign'];
        $secukey="mkoi54345jk03r34kr23erk20239";
        $cal_sign = hash_hmac('sha256',$data,$secukey);
        if($cal_sign != $sign){
            return 'sign error';
        }
        $chang=substr($data,3,1);
        $datav=substr($data,4+$chang);
        $datav = str_replace(['--'],['='],$datav);
        $datav = strrev($datav);
        $jsonstr = base64_decode($datav);
        $rarr = json_decode($jsonstr,1);
        return $rarr;
    }
 
    //测试调用
    public function test()
    {
        $arr=['a'=>100,'b'=>200,'c'=>2342,'wqe'=>'非常不错的一个传送']; //传送数据
        $send = $this->hmacsign($arr); //加密签名后 传送
 
        $rarr   = $this->dedatasign($send); //接受到 验签,解密
 
        $d =['o'=>$arr,'s'=>$send,'r'=>$rarr];
 
        $this->success('返回成功', $d);
    }

  

时间有效期加密

<?php
// 假设你已经有了一个API密钥和密钥。
$apiKey = 'your_api_key';
$apiSecret = 'your_api_secret';
 
// 设置过期时间为当前时间的20分钟后。
$expiresIn = 20 * 60; // 单位为秒
 
// 使用hash_hmac函数生成哈希签名。
$hash = hash_hmac('sha256', $apiKey . $expiresIn, $apiSecret, true);
 
// 将哈希编码为base64字符串。
$token = base64_encode($hash);
 
// 输出结果。
echo "API Token: " . $token;
 
// 如果需要验证token是否过期,可以按照以下方式进行:
$decodedHash = base64_decode($token);
$expectedHash = hash_hmac('sha256', $apiKey . $expiresIn, $apiSecret, true);
 
// 比较两个哈希是否相同。
$isValid = hash_equals($decodedHash, $expectedHash);
 
// 输出验证结果。
echo "Token is valid: " . ($isValid ? 'Yes' : 'No');

  

posted @ 2024-10-18 14:11  星云惊蛰  阅读(17)  评论(0)    收藏  举报