PHP 接口开发 签名验证

https://www.cnblogs.com/bjfy/p/5909690.html

生成token

  public function createToken()
    {
        $str = md5(uniqid(md5(microtime(true)),true));  //生成一个不会重复的字符串
        $str = sha1($str);  //加密
        return $str;
    }

接口开发中为了防止接口被恶意调用,可以设置签名验证。首先可以设置一个密钥key ,就是一个比较长的字符串,然后设置一定的签名规则,例如将所有的参数进行字典排序封装成一个字符串,连接密钥,再进行md5加密,就生成了所谓的签名。

 public function create_sign()
    {
        //参数中含有sign
        $params = $this->request->all();
        if (array_key_exists('sign', $params) === false) {
            return '';
        }
        unset($params['sign']);
        if (count($params) >= 1) {
            //参数字典排序
            ksort($params);
            $str = '';
            $i = 0;
            foreach ($params as $key => $val) {
                if ($i == 0) {
                    $str .= $key . "=" . $val;
                } else {
                    $str .= "&" . $key . "=" . $val;
                }
                $i++;
            }
            return md5($str . $this->key);
        }
        return '';

    }

这个密钥一般是一个用户对应一个密钥,但是也是不安全的。

最常用的签名方法就是RSA 签名,这个网上有很多资料,具体不再详解。今天主要记录一下 ECDSA签名验证,以及公私钥生成的方法,当然是借助于php的内置函数openssl。

 $config = array(
            "private_key_type" => OPENSSL_KEYTYPE_EC,
            'curve_name'=>'secp256k1',
            'digest_alg'=>'sha256',
        );
        $resource=openssl_pkey_new($config);
        //只能导出私钥
        //openssl_pkey_export($kk,$pp,'33',$config);
       
        $info=openssl_pkey_get_details($resource);
        $public_key=$info['key'];
        openssl_pkey_export($resource, $privkey,'33',$config);
        $kk=openssl_pkey_get_private($privkey,'33');
        openssl_sign('123456',$str,$kk,OPENSSL_ALGO_SHA256);

在变量config中可以直接指定openssl支持的验簽类型,RSA ,当然这里是EC 就是椭圆曲线算法。生成签名使用了openssl_sign 函数。

 $mm='MEUCICLD6Mo3166dlJVdwueYyl4pJT5fYSm7G5rJPGiZqq0KAiEAheaOI7Bqeu+M1kCK1C4Oj3B5T3gR8zH/Q6zH4E4Vvi4=';
        $keyData = file_get_contents(base_path()."/cert.pem");
        $int=openssl_verify('123456',base64_decode($mm),$keyData,OPENSSL_ALGO_SHA256);
验簽工作中忽略了指定生成摘要的算法,采用了默认的摘要算法:sha1  而我生成签名采用的sha256,所以浪费了好多时间。很好用,不用关心算法的具体实现。

你可能感兴趣的:(php,函数)