在php语言中对数组参数实现签名算法及加解密数组功能流程步骤

2023-06-01 00:00:00 算法 数组 中对

今天做一个项目功能需要对数组签名算法及加解密功能实现,记录之。

思路:

1.对数组参数进行签名(生成token,一些保密的参数,解密用);

2.生成token后变成新元素,插入原数组中;

3.把数组转成转json字符串;

4.在把json字符串转16进制值;

5.最后对16进制值进行base64加密;


解密就反之。


进入步骤

要签名的参数数组:

        $ampconfig = array (
            'tid' => 10091,
            'medium_id' => array ( "e0s7e5eo3"),
            'page' => $page,
            'pagesize' => 100,
            'timestamp' => $timestamp,
            'earliest' => $earliest,
        );

先说对数组参数进行签名,示例代码:

    /**
     * 参数签名
     * 1. 首先对参数按key的字母字典顺序排序
     * 2. 遍历参数并将key和value拼接为字符串(value为数组时先json再拼接, value为数组 时,需保证数组的值为string类型)
     * 3. 对字符串MD5后加盐再做一次MD5
     */
    public function getSign($args)
    {
           //盐
        $salt = 'sNmphCxE';
        if (!$args) return '';
        ksort($args);
        $signStr = '';
        foreach ($args as $k => $v) {
            if ($v || is_numeric($v)) {
                if (is_array($v)) {
                    $v = json_encode(array_map('strval', $v));
                }
                $signStr .= $k.$v;
            }
        }
        return strtoupper(md5(md5($signStr) . $salt));
    }

签名生成token,并插入原数组中:

        $tk = $this->getSign($ampconfig);
        $ampconfig['token'] = $tk;

把数组转成转json字符串

        $jsons = json_encode($ampconfig);

在把json字符串转16进制值

        //转16进制字符串 , bin2hex函数将字符串转换成16进制的形式输出,bin2hex()函数返回结果为ascii码
        $jsons16 = bin2hex($jsons);
        echo $jsons16; echo '<br>';

最后对16进制值进行base64加密

        //最后使用对json 16进制值进行base64加密
        $jsons16base64 = base64_encode($jsons16);
        echo $jsons16base64;

解密反之:

dd(json_decode(hex2bin(base64_decode($jsons16base64)),true));


完整代码示例:

        //传一些动态参数进来
        $query = request()->input();
       
        //默认当前日期
        $timestamp = $query['timestamp']??time();
        //默认当月1号
        $earliest = $query['earliest']??strtotime(date('Ym').'01');
        $page = $query['page']??1;
        print_r($query);
       
        $ampconfig = array (
            'tid' => 10091,
            'medium_id' => array ( "e0s7e5eo3"),
            'page' => $page,
            'pagesize' => 100,
            'timestamp' => $timestamp,
            'earliest' => $earliest,
        );
       
        $tk = $this->getSign($ampconfig);
        $ampconfig['token'] = $tk;
       
        //转json
        $jsons = json_encode($ampconfig);
       
        //转16进制字符串 , bin2hex函数将字符串转换成16进制的形式输出,bin2hex()函数返回结果为ascii码
        $jsons16 = bin2hex($jsons);
        echo $jsons16; echo '<br>';
       
        //最后使用对json 16进制值进行base64加密
       
        $jsons16base64 = base64_encode($jsons16);
        echo $jsons16base64;
       
        //解密反之操作
        dd(json_decode(hex2bin(base64_decode($jsons16base64)),true));

效果看看:

签名算法加解密.png

相关文章