php数据接口api安全,API接口数据安全之授权码sign

**API接口数据安全之授权码sign**

>[success] 1. ASE加密方式加密

~~~

class Aes{

private $key = null;

/**

*@param String $key 密钥

*@return String

*/

public funciton __construct(){

//配置文件中的asekey 服务端及客户端必须保持一致 且加密key必须为16 、32、64位

$this->key = C('app.asekey');

}

/**

*加密

*@param String input 加密的字符串

*@param String key 解密的key

*@return HexString

*/

public function encrypt($input=''){

$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_ECB); // 获得加密算法的分组大小

$input = $this->pkcs5_pad($ipunt,$size);

$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'',MCRYPT_MODE_ECB,'');

$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);

mcrypt_generic_init($td,$this->key,$iv);

$data = mcrypt_generic($td,$input);

mcrypt_generic_deinit($td);

mcrypt_module_close($td);

$result = base64_encode($data);

return $result;

}

/**

*填充方式 pkcs5

*@param String text 原始字符串

*@param String blocksize 加密长度

*@return String

*/

private function pkcs5_pad($text,$blocksize){

$pad = $blocksize-(strlen($text) % $blocksize);

return $text.str_repeat(chr($pad),$pad);

}

/**

*解密

*@param String str 加密的字符串

*@param String key 解密的key

*@return String

*/

public function decrypt($str){

$decryted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$this->key,base64_decode($str),MCRYPT_MODE_ECB);

$dec_s = strlen($decryted);

$padding = ord($decryted[$dec_s-1]);

$decryted = substr($decryted,0,-$padding);

return $decryted;

}

}

~~~

>[success]2.生成加密后的sign

~~~

/**

*生成请求的sign

*@param array $data

*@return string

*/

function setSign($data=array()){

//1.按字段排序

ksort($data);

// 2.拼接字符串数据 &

$string = http_build_query($data);

// 3.通过aes来加密

$sign = (new Aes())->encrypt($string);

return $sign;

}

//示例

$data = [

'did' => '12345dg',

'version' => '1.0'

];

$sign = setSign($data); //ne2qhhj4x3abeHKH+mhNV04USjWNzhkA5bcB7bxH4EA=

~~~

>[success]3.解密sign

~~~

$sign = "ne2qhhj4x3abeHKH+mhNV04USjWNzhkA5bcB7bxH4EA=";

echo (new Aes())->decrypt($sign); // did=12345dg&version=1.0

~~~

>[success]4.校验客户端的sign

~~~

/**

*@param Stirng clientSign 通过客户端的header头传递过来

*@param Array data 客户端提交过来的字段

*@return boolen

*/

function checkSign($clientSign='',$data=array()){

if(empty($clientSign)){

return false;

}

$checkSign = setSign($data); // 生成sign

if($clientSign != $checkSign){

return false;

}

return true;

}

~~~

**函数**

>[danger] parse_str() 函数的使用

~~~

$str = "did=12345dg&version=1.0";

parse_str($str,$arr);

var_dump($arr);die;

结果为:

array(2) {

["did"]=>

string(7) "12345dg"

["version"]=>

string(3) "1.0"

}

~~~

>[danger]http_build_query()函数的使用

~~~

$data = array(

'did'=> '12345dg',

'version'=> '1.0'

);

$str = http_build_query($data);

echo $str; // did=12345dg&version=1.0 将数组以&拼接

~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值