tp6api接口加密中间件
时间:2022-12-08 20:00:00
前言
前段时间有个同事突然说,APP接口能否加密,token很容易被破解,让我想办法不让别人破解。我搜了一会儿头,发现这件事还没做,就对他说我试试。作为一名程序员,百度编程已经成为一项必要的技能。网上百度有几种加密方式:
- php后端生成密钥并发送给开发人员。开发人员根据密钥添加参数md5加密,生成sign。根据密钥对后端获取的数据进行加密比较sign。安全性较强
- token只要你得到用户的加密,这种加密方法就太普遍了token,你可以随意要求,安全一般
- 加密算法对称加密算法uid 网站公钥及时加密,可在一定时间内使用。当会员成功登录时,服务器端对此进行处理ID加密后返回客户端,每次客户端要求接口时带上参数,服务器端通过解密认证。
综上所述,它仍然是第一个可靠的
用tp6中间件加密
主要分为两部分:
- 生成APP密钥可以是一串乱码或随机字符串。
- tp6中间件验证
生成密钥
这取决于你自己的想法。只要不重复,就不会有问题
public static function create_unique() { $data = $_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR'] //生成密钥 .time() . rand(); return substr(md5(time().$data),0,24); /截取前24位 //return md5(time().$data); //进行md5加密,并返回一个密钥 }
发送这个密钥APP开发人员使用密钥加密参数。
重点来了,tp6中间件验证密钥
首先要写一个中间件来验证参数。
class AppMiddleware implements MiddlewareInterface { /** 接口sign 验证 * @param Request $request * @param \Closure $next * @param bool $force * @return mixed */ public function handle(Request $request, \Closure $next, bool $force = true) { // 1、获取参数 $param = $request->param(); // 判断sign time_stamp 是否存在 if(empty($param['sign']) || empty($param['time_stamp'])) return json(密钥错误); // 时间判断 大于3600s返回 系统错误 $time_limit = 3600; if(abs((int)$param['time_stamp'] - time()) > $time_limit){ Log::error时间超时.time().' param= '.json_encode($param)); } // try { // $app_api_key = env('app.api_app_key'); // } catch (AuthException $e) { // return json(密钥错误); // } // 2.添加私钥并排序参数 $app_api_key = ‘asdfasdfasdfas; ///填写您刚生成的密钥 if(is_null($app_api_key)){ return json(密钥错误); } $param['api_key'] = $app_api_key;// 加入私钥 // 3.过滤不必要的参数 ksort($param); // 降序数组键(字母) $str = ''; foreach ($param as $key => $val) { if ($key == 'sign') continue;// 符合下列条件的不拼接 $str = $str .(string)$val;// 拼接数组值[数组键(字母)降序] } // 4、生成签名 $sign = md5($str); // 判断sign if(empty($sign) || $param['sign'] != $sign){ Log::error接口错误 sign= '.$sign.' param= '.json_encode($param)); } return $next($request); } }