复杂数组的签名生成方法

应用环境:服务器需要通过签名验证客户端传过来的数据的合法性

方法:

之前在传送数据时尽量不使用复杂的数组(数组里面套数组)的方式,主要是因为对这种数组没有一个好的签名方法,现在我想到使用递归的方法去解决这个问题,还请大家多多指教 。

具体实现方式:

1、需要一个对一维数组进行签名的方法,返回为一个字符串。这个方法是基础。

2、先排序,然后按照数组的key顺序访问数组,临时变量key => value,如果value为数组,对value进行签名并把签名结果作为value的新值,如果value中也有数组,则重复签名并赋值的操作

3、执行到倒数第二步的时候,整个签名就变成了对一维数组进行签名


实验步骤:

php代码:

<?php

function sig($array)
{
        $str = '';//实际运行中需要增加一个key用来防止加密方法被破解,我认为这个key可以根据时间戳动态生成
        foreach ( $array as $k => $v ) {
                if ( is_array($v) ) {
                        $v = sig($v); //递归调用,并把返回值作为当前的key对应的value
                }
                $str .= $k.'='.$v.'&';
        }   
        $str = md5($str);//仅仅为了说明原理,所以这里简单的使用了md5方式进行加密,实际环境中需要根据实际情况选择一种或多种加密方法
     echo $str."
"; //测试用的,用来跟踪递归调用情况。
        return $str;
}

$array = array(
                '1',
                '2',
                array(
                        'a',
                        'b',
                        'c',
                        array(
                                'd',
                                'e',
                                'a'
                                ),
                        )
                );

echo sig($array);

下面是运行结果:

562b5cf3b1d346b3978f7c02ab3c0238
ca8ad73db06f763573a91fa65a8ad833
2a5d26e5f6db57d8e845c28d1882ea92
2a5d26e5f6db57d8e845c28d1882ea92

如果有不当之处还请多多指正哈。

原文地址:https://www.cnblogs.com/imoing/p/3311847.html