PHP接口开发数据签名程序代码

七月 26, 2019 | views
Comments 0

PHP接口开发数据签名这个非常的重要不但要有好的算法同时也要保密了,下面我们来看一篇由php实现的关于PHP接口开发数据签名例子吧,具体如下所示。

现在应用开发中通常会用到接口,其数据是通过开放的互联网传输,对数据的安全性有一定要求,为了防止数据在传输过程中被篡改,常用数据签名(sign)的方式来校验。

数据签名sign生成方法:

①去除数组中的空值和签名参数(sign/sign_type)

②按键名升序排列数组

③把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串

④把拼接后的字符串再与安全校验码直接连接起来

⑤MD5等加密函数,加密字符串

示例代码:


  1. class Sign { 
  2.  
  3.     /** 
  4.      * 获取数据签名 
  5.      *  
  6.      * @param  array  $param  签名数组 
  7.      * @param  string $code      安全校验码 
  8.      * @param  string $sign_type 签名类型 
  9.      * @return string        签名字符串 
  10.      */ 
  11.     public static function getSign($param$code$sign_type = 'MD5'){ 
  12.         //去除数组中的空值和签名参数(sign/sign_type) 
  13.         $param = self::paramFilter($param); 
  14.         //按键名升序排列数组 
  15.         $param = self::paramSort($param); 
  16.         //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 
  17.         $param_str = self::createLinkstring($param); 
  18.         //把拼接后的字符串再与安全校验码直接连接起来 
  19.         $param_str = $param_str . $code
  20.         //创建签名字符串 
  21.         return self::createSign($param_str$sign_type); 
  22.     } 
  23.       
  24.     /** 
  25.      * 校验数据签名 
  26.      * 
  27.      * @param  string $sign  接口收到的签名 
  28.      * @param  array  $param  签名数组 
  29.      * @param  string $code      安全校验码 
  30.      * @param  string $sign_type 签名类型 
  31.      * @return boolean true正确,false失败 
  32.      */ 
  33.     public static function checkSign($sign$param$code$sign_type = 'MD5'){ 
  34.         return $sign == self::getSign($param$code$sign_type); 
  35.     } 
  36.       
  37.     /** 
  38.      * 去除数组中的空值和签名参数 
  39.      *  
  40.      * @param  array $param 签名数组 
  41.      * @return array        去掉空值与签名参数后的新数组 
  42.      */ 
  43.     private static function paramFilter($param){ 
  44.         $param_filter = array(); 
  45.         foreach ($param as $key => $val) { 
  46.             if($key == 'sign' || $key == 'sign_type' || !strlen($val)){ 
  47.                 continue
  48.             } 
  49.             $param_filter[$key] = $val
  50.         } 
  51.         return $param_filter
  52.     } 
  53.       
  54.     /** 
  55.      * 按键名升序排列数组 
  56.      *  
  57.      * @param  array $param 排序前的数组 
  58.      * @return array        排序后的数组 
  59.      */ 
  60.     private static function paramSort($param){ 
  61.         ksort($param); 
  62.         reset($param); 
  63.         return $param
  64.     } 
  65.       
  66.     /** 
  67.      * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 
  68.      *  
  69.      * @param  array $param 需要拼接的数组 
  70.      * @return string       拼接完成以后的字符串 
  71.      */ 
  72.     private static function createLinkstring($param){ 
  73.         $str = ''
  74.         foreach ($param as $key => $val) { 
  75.             $str .= "{$key}={$val}&"
  76.         } 
  77.         //去掉最后一个&字符 
  78.         $str = substr($str, 0, strlen($str) - 1); 
  79.         //如果存在转义字符,那么去掉转义 
  80.         if(get_magic_quotes_gpc()){ 
  81.             $str = stripslashes($str); 
  82.         } 
  83.         return $str
  84.     } 
  85.       
  86.     /** 
  87.      * 创建签名字符串 
  88.      *  
  89.      * @param  string $param 需要加密的字符串 
  90.      * @param  string $type  签名类型 默认值:MD5 
  91.      * @return string 签名结果 
  92.      */ 
  93.     private static function createSign($param$type = 'MD5'){ 
  94.         $type = strtolower($type); 
  95.         if($type == 'md5'){ 
  96.             return md5($param); 
  97.         } 
  98.         if($type == 'dsa'){ 
  99.             exit('DSA 签名方法待后续开发,请先使用MD5签名方式'); 
  100.         } 
  101.         exit("接口暂不支持" . $type . "类型的签名方式"); 
  102.     } 



zend