应用环境:服务器需要通过签名验证客户端传过来的数据的合法性
方法:
之前在传送数据时尽量不使用复杂的数组(数组里面套数组)的方式,主要是因为对这种数组没有一个好的签名方法,现在我想到使用递归的方法去解决这个问题,还请大家多多指教 。
具体实现方式:
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
如果有不当之处还请多多指正哈。