zoukankan      html  css  js  c++  java
  • API开发之接口安全(一)----生成sign

    在对于API的开发中 最让人头疼的 就是接口数据暴露 让一些有心之人 抓包之后恶意请求 那么如何解决这一弊端呢?自然而然的 我们就想到了 加密  那我们又如何加密 如何解密 才能使之有最安全的效率呢?这是一个值得我们深思的问题 带着这些问题 我们来尝试着 一一解决他们

    首先加密校验是需要在每次请求的时候 都要去做的 所以我们需要 写一个公共类 让其他类来继承 暂定这个类就为 Common 吧

    <?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date: 2019/8/15
     * Time: 15:00
     */
    
    namespace appindexcontroller;
    
    
    use thinkController;
    
    class Common extends Controller
    {
        public function _initialize(){
            $this->checkRequestAuth();
        }
    
        public function checkRequestAuth(){
            ##获取头信息  
            $header = request()->header();
            halt($header);
        }
    }    

    上面代码很简单 我们就是单纯的获取一下header里面的信息 为什么要获取header而不是body里的信息呢  可能header好听吧(手动滑稽) 那么既然我们获取的是header里面的内容 那么这里面去放什么内容 才能是我们更好的校验呢 这就需要和前端小姐姐共同商议啦 当然 我这边已经确定 我们需要的 参数啦  

    sign   参数加密后生成的签名
    version APP版本号
    app_type APP类型 ios android之类
    did 唯一标识ID
    model 类似手机型号之类的值

    在我们定义好header里面的内容之后 那么我们就要开始在 Common类里面大展拳脚了 

    我们需要了解  sign  加密是需要客户端去做的  解密是需要我们服务端来做的 但是正常流程来说 是需要我们服务端测试加密解密无误后 才开放接口给客户端的 所以这里 我们必须 去实现加密功能

    下来  我们去搞一波 加密算法 我们使用 AES加密算法来进行测试 

    <?php
    namespace appcommonlib;
    
    /**
     * aes 加密 解密类库
     * @by singwa
     * Class Aes
     * @package appcommonlib
     */
    class Aes {
    
        /**
         * var string $method 加解密方法,可通过openssl_get_cipher_methods()获得
         */
        protected $method;
    
        /**
         * var string $secret_key 加解密的密钥
         */
        protected $secret_key;
    
        /**
         * var string $iv 加解密的向量,有些方法需要设置比如CBC
         */
        protected $iv;
    
        /**
         * var string $options (不知道怎么解释,目前设置为0没什么问题)
         */
        protected $options;
    
        /**
         * 构造函数
         *
         * @param string $key 密钥
         * @param string $method 加密方式
         * @param string $iv iv向量
         * @param mixed $options 还不是很清楚
         *
         */
        public function __construct($key, $method = 'AES-128-ECB', $iv = '', $options = 0)
        {
    
            // key是必须要设置的
            $this->secret_key = isset($key) ? $key : config('app.aeskey');
    
            $this->method = $method;
    
            $this->iv = $iv;
    
            $this->options = $options;
        }
    
        /**
         * 加密方法,对数据进行加密,返回加密后的数据
         *
         * @param string $data 要加密的数据
         *
         * @return string
         *
         */
        public function encrypt($data)
        {
            return openssl_encrypt($data, $this->method, $this->secret_key, $this->options, $this->iv);
        }
    
        /**
         * 解密方法,对数据进行解密,返回解密后的数据
         *
         * @param string $data 要解密的数据
         *
         * @return string
         *
         */
        public function decrypt($data)
        {
            return openssl_decrypt($data, $this->method, $this->secret_key, $this->options, $this->iv);
        }
    }

    秘钥写在配置文件里

    return [
        'aeskey' => 'asdasd4wq5646',  #AES秘钥  服务端必须和客户端保持一致
        'method' => 'AES-128-ECB',
        'iv' => '',
        'options' => '0',
    ];

    现在我们的 加密算法已经准备就绪 下来我们需要做的就是 将传进来的参数进行整合 加密后 返回  这样我们的 sign就生成了

    因为生成sign属于鉴权类型 所以我们 在appcommonlib下新建 IAuth 类

    <?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date: 2019/8/15
     * Time: 16:06
     */
    
    namespace appcommonlib;
    
    use appcommonlibAes;
    
    
    class IAuth
    {
        /**
         * 生成每次请求的sign
         * @param array $data
         * @return string
         */
        public static function setSign($data = []){
            ## 1 按字典进行相对应的排序
            ksort($data);
            ## 2 转换为&拼接的参数
            $string = http_build_query($data);
            ## 3 通过 aes 来加密
            $string = (new Aes())->encrypt($string);
    
            return $string;
        }
    }

    生成sign类写好了 我们去测试下

    <?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date: 2019/8/15
     * Time: 15:03
     */
    
    namespace appindexcontroller;
    
    
    use appcommonlibAes;
    use appcommonlibIAuth;
    
    class Test extends Common
    {
        public function index(){
            ##  加密部分
    //        $data = [
    //            'did'=>1,
    //            'version'=>"1.1.0",
    //        ];
    //
    //        halt(IAuth::setSign($data));
    
            #解密部分
            $str = "g/1A3h+7XZZrdc3Gw1yEJBEAWTiKEm/veV5vMlyFLpc=";
    
            halt((new Aes())->decrypt($str));
        }
    }

    加密解密都没有问题  生成sign成功 下一节 我们进行验证操作

  • 相关阅读:
    UVALive 6909 Kevin's Problem 数学排列组合
    UVALive 6908 Electric Bike dp
    UVALive 6907 Body Building tarjan
    UVALive 6906 Cluster Analysis 并查集
    八月微博
    hdu 5784 How Many Triangles 计算几何,平面有多少个锐角三角形
    hdu 5792 World is Exploding 树状数组
    hdu 5791 Two dp
    hdu 5787 K-wolf Number 数位dp
    hdu 5783 Divide the Sequence 贪心
  • 原文地址:https://www.cnblogs.com/we-jack/p/11358731.html
Copyright © 2011-2022 走看看