网站首页前端

js接口签名及后端验签

发布时间:2023-03-22 12:14:21编辑:slayer.hover阅读(1112)

    1. 前端js,拼接接口参数,生成签名sign

    第一步: 安装 crypto-js

    npm install crypto-js


    第二步:引入CryptoJS

    import CryptoJS from 'crypto-js'


    第三步: 生成签名

    let params = {
        param1: '111',
        param2: '222',
        ...
        timestamp: Date.now(),
    };
    params.sign= generateSign(params);
    
    request({
        url,
        params
    })
    
    function generateSign(param) {
        let paramKeys = Object.keys(param);
        let paramArr = [];
        paramKeys.forEach(function (value, key) {
            let typeVal = typeof(param[value]);
            if (value!='sign' && param[value] !== undefined && 
                param[value] !== null && param[value] !== '' && typeVal!=='object' ){
                    let oneItem = value+'='+param[value];
                    paramArr.push(oneItem);
            }
        });
        let paramStr = paramArr.sort().join("&");
        let secretKey = '11111111111111111111111';  //与后端secretKey保持一致
        
        return CryptoJS.HmacSHA256(paramStr, secretKey).toString();
    }



    2. 后端验证签名

    在PHP后端接口入口处, 或中间件中加入验签方法

    function checkSign($params) {
        $sign   = $params['sign'];
        unset($params['sign']);
        ksort($params);
        foreach ($params as $paramKey => $paramVal)
        {
            if(is_array($paramVal) || $paramVal === null || $paramVal === '')continue;
                $paramStr .= $paramKey.'='.$paramVal.'&';
        }
        $paramStr  = substr($paramStr, 0, -1);        
        $secretKey = '11111111111111111111111';  //与前端secretKey保持一致
            
        $mySign = hash_hmac('sha256', $paramStr, $secretKey);
        if($mySign!==$sign) {
            throw new \Exception('异常请求', 403);
        }
    }




评论