• API接口加密方法API接口加密代码分享


    API接口加密校验源代码分享

    API接口做好了,总不能裸奔调用吧,也不能在HTTP/HTTS里键入约定的密钥模式,下面给大家介绍一种简单的API接口加密验证

    API接口加密通信思路:

    1. 约定密钥,密钥在实际操作中可以做个配置文件,随意更换

    2. 生成时间戳、随机数、签名生成的字符串

    3.推送到API服务端做加密校对识别

    API接口通信服务端加密类源代码类

    class encry {
        const TOKEN = 'API';
        //响应前台的请求
        public function respond(){
            //验证身份;接收前台传过来的参数
            $timeStamp = isset($_GET['t']) ? $_GET['t'] :'';//时间
            $randomStr = isset($_GET['r']) ? $_GET['r'] :'';//随机数
            $signature = isset($_GET['s']) ? $_GET['s'] :'';//签名
            $str = $this -> arithmetic($timeStamp,$randomStr);//通过前台传过来的时间戳跟随机数重新按照签名函数进行生成一遍签名
    //然后将传过来签名跟,自己重新生成的签名进行比对
            if($str != $signature){
                $arr['success'] = '0';
                $arr['msg'] = '无权访问';
            }
            else{
                $arr['success'] = '1';
                $arr['msg'] = 'success';
            }
            echo json_encode($arr,JSON_UNESCAPED_UNICODE);
        }
    
        /**
         * @param $timeStamp 时间戳
         * @param $randomStr 随机字符串
         * @return string 返回签名
         */
        public function arithmetic($timeStamp,$randomStr){
            $arr['timeStamp'] = $timeStamp;
            $arr['randomStr'] = $randomStr;
            $arr['token'] = self::TOKEN;
            //按照首字母大小写顺序排序
            sort($arr,SORT_STRING);
            $str = implode($arr);//拼接成字符串
            $signature = sha1($str);//SHA-1加密
            $signature = md5($signature);//MD5=加密
            $signature = strtoupper($signature);//转换成大写
            return $signature;
        }
    }

    客户端调用API接口推送加密代码类

    class apiget{
        const TOKEN = 'API';//密钥
        const APIURL = 'http://www.68v8.com/api.php';//模拟前台请求服务器api接口
        public function getDataFromServer(){
            $timeStamp = time();//时间戳
            $randomStr = $this -> createNonceStr();//随机数
            $signature = $this -> arithmetic($timeStamp,$randomStr);//生成签名,这里生成签名方法自己定义,可以用这个方法,也可以用非对称加密都可以;
            $url = self::APIURL."?t={$timeStamp}&r={$randomStr}&s={$signature}";//url地址:地址中传递的三个参数,可以直接这样传递,也可以用非对称加密加密完成后再传到地址中都可以
            $result = $this -> httpGet($url);
            echo($result);
        }
    
        //curl模拟get请求。
        private function httpGet($url){
            $curl = curl_init();
            curl_setopt($curl,CURLOPT_URL,$url);//需要请求的是哪个地址
            curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);//表示把请求的数据已文件流的方式输出到变量中
            $result = curl_exec($curl);
            curl_close($curl);
            return $result;
        }
    
        //随机生成字符串
        private function createNonceStr($length = 8) {
            $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            $str = "";
            for ($i = 0; $i < $length; $i++) {
                $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
            }
            return "z".$str;
        }
    
        /**
         * @param $timeStamp 时间戳
         * @param $randomStr 随机字符串
         * @return string 返回签名
         */
        private function arithmetic($timeStamp,$randomStr){
            $arr['timeStamp'] = $timeStamp;
            $arr['randomStr'] = $randomStr;
            $arr['token'] = self::TOKEN;
            //按照首字母大小写顺序排序
            sort($arr,SORT_STRING);
            $str = implode($arr);//拼接成字符串
            $signature = sha1($str);//SHA-1加密加密
            $signature = md5($signature);//MD5加密
            $signature = strtoupper($signature);//转换成大写
            return $signature;
        }
    }

    调用类

    $apiget = new apiget();
    $apiget->getDataFromServer();

    授人以鱼不如授人以渔,分享是一种快乐,简单的代码能够对你们有用也是一种快乐,技术交流微信号:15889726201

  • 相关阅读:
    HashSet源码分析
    Mysql的体系结构和存储引擎
    触发器
    存储过程和函数
    索引
    SpringBoot 中的日志使用
    log4j2
    Logback
    slf4j
    日志门面
  • 原文地址:https://www.cnblogs.com/keleyu/p/13634490.html
Copyright © 2020-2023  润新知