在对于API的开发中 最让人头疼的 就是接口数据暴露 让一些有心之人 抓包之后恶意请求 那么如何解决这一弊端呢?自然而然的 我们就想到了 加密  那我们又如何加密 如何解密 才能使之有最安全的效率呢?这是一个值得我们深思的问题 带着这些问题 我们来尝试着 一一解决他们

首先加密校验是需要在每次请求的时候 都要去做的 所以我们需要 写一个公共类 让其他类来继承 暂定这个类就为 Common 吧

<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/8/15
* Time: 15:00
*/ namespace app\index\controller; use think\Controller; class Common extends Controller
{
public function _initialize(){
$this->checkRequestAuth();
} public function checkRequestAuth(){
##获取头信息
$header = request()->header();
halt($header);
}
}

上面代码很简单 我们就是单纯的获取一下header里面的信息 为什么要获取header而不是body里的信息呢  可能header好听吧(手动滑稽) 那么既然我们获取的是header里面的内容 那么这里面去放什么内容 才能是我们更好的校验呢 这就需要和前端小姐姐共同商议啦 当然 我这边已经确定 我们需要的 参数啦

sign   参数加密后生成的签名
version APP版本号
app_type APP类型 ios android之类
did 唯一标识ID
model 类似手机型号之类的值

在我们定义好header里面的内容之后 那么我们就要开始在 Common类里面大展拳脚了

我们需要了解  sign  加密是需要客户端去做的  解密是需要我们服务端来做的 但是正常流程来说 是需要我们服务端测试加密解密无误后 才开放接口给客户端的 所以这里 我们必须 去实现加密功能

下来  我们去搞一波 加密算法 我们使用 AES加密算法来进行测试

<?php
namespace app\common\lib; /**
* aes 加密 解密类库
* @by singwa
* Class Aes
* @package app\common\lib
*/
class Aes { /**
* var string $method 加解密方法,可通过openssl_get_cipher_methods()获得
*/
protected $method; /**
* var string $secret_key 加解密的密钥
*/
protected $secret_key; /**
* var string $iv 加解密的向量,有些方法需要设置比如CBC
*/
protected $iv; /**
* var string $options (不知道怎么解释,目前设置为0没什么问题)
*/
protected $options; /**
* 构造函数
*
* @param string $key 密钥
* @param string $method 加密方式
* @param string $iv iv向量
* @param mixed $options 还不是很清楚
*
*/
public function __construct($key, $method = 'AES-128-ECB', $iv = '', $options = 0)
{ // key是必须要设置的
$this->secret_key = isset($key) ? $key : config('app.aeskey'); $this->method = $method; $this->iv = $iv; $this->options = $options;
} /**
* 加密方法,对数据进行加密,返回加密后的数据
*
* @param string $data 要加密的数据
*
* @return string
*
*/
public function encrypt($data)
{
return openssl_encrypt($data, $this->method, $this->secret_key, $this->options, $this->iv);
} /**
* 解密方法,对数据进行解密,返回解密后的数据
*
* @param string $data 要解密的数据
*
* @return string
*
*/
public function decrypt($data)
{
return openssl_decrypt($data, $this->method, $this->secret_key, $this->options, $this->iv);
}
}

秘钥写在配置文件里

return [
'aeskey' => 'asdasd4wq5646', #AES秘钥 服务端必须和客户端保持一致
'method' => 'AES-128-ECB',
'iv' => '',
'options' => '0',
];

现在我们的 加密算法已经准备就绪 下来我们需要做的就是 将传进来的参数进行整合 加密后 返回  这样我们的 sign就生成了

因为生成sign属于鉴权类型 所以我们 在app\common\lib下新建 IAuth 类

<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/8/15
* Time: 16:06
*/ namespace app\common\lib; use app\common\lib\Aes; class IAuth
{
/**
* 生成每次请求的sign
* @param array $data
* @return string
*/
public static function setSign($data = []){
## 1 按字典进行相对应的排序
ksort($data);
## 2 转换为&拼接的参数
$string = http_build_query($data);
## 3 通过 aes 来加密
$string = (new Aes())->encrypt($string); return $string;
}
}

生成sign类写好了 我们去测试下

<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/8/15
* Time: 15:03
*/ namespace app\index\controller; use app\common\lib\Aes;
use app\common\lib\IAuth; class Test extends Common
{
public function index(){
## 加密部分
// $data = [
// 'did'=>1,
// 'version'=>"1.1.0",
// ];
//
// halt(IAuth::setSign($data)); #解密部分
$str = "g/1A3h+7XZZrdc3Gw1yEJBEAWTiKEm/veV5vMlyFLpc="; halt((new Aes())->decrypt($str));
}
}

加密解密都没有问题  生成sign成功 下一节 我们进行验证操作

API开发之接口安全(一)----生成sign的更多相关文章

  1. API开发之接口安全(三)----sign有效时间

    之前生成的sign和校验sign我们已经完全掌握了.但是仅仅凭借这样的sign是无法满足我们的需求的,如果一个黑客通过抓包抓到你的数据 他可以去修改你的header为这样的 body为那样的 也是可以 ...

  2. API开发之接口安全(二)-----sign校验

    上一章 我们说了 sign的生成 那么 我们如何确定这个sign的准确性呢 下来 我们说说 校验sign的那些事 在拿到header里面的内容之后 我们首先需要对其内容的基本参数做一个校验 我们补充下 ...

  3. API开发之接口安全(四)----sign的唯一性

    r如何解决sign的唯一性呢,在以往的经验中,我们都是通过标识来确定 如果有 那就用过如果没有那就是没用过 当然我们还需要将sign存储起来 这样我们才能更好的去判断他是否用过 存储的话 我们有几种方 ...

  4. asp.net开源流程引擎API开发调用接口大全-工作流引擎设计

    关键词: 工作流引擎 BPM系统 接口调用 工作流快速开发平台  工作流流设计  业务流程管理   asp.net 开源工作流 一.程序调用开发接口二.   接口说明 所谓的驰骋工作流引擎的接口,在B ...

  5. 豆瓣api开发

    前面有说过豆瓣API的开发,在做一些开源项目的时候,很多时候会用到豆瓣API接口,拿过来做测试,现在只是对豆瓣API开发做一些简单的梳理: 豆瓣API开发的接口: https://developers ...

  6. Asp.Net Web Api 与 Andriod 接口对接开发

    Asp.Net Web Api 与 Andriod 接口对接开发经验,给小伙伴分享一下!   最近一直急着在负责弄Asp.Net Web Api 与 Andriod 接口开发的对接工作! 刚听说要用A ...

  7. python3.8.0 Django 开发后端接口api 部署到 Linux Centos7上

    经历了两天的时候终于把本地使用python3 django开发的接口API部署到服务器上了,还是记录一下,以免之后忘记,哈哈 注意一点,就是,centos7是基于python2的,我这边默认的是pyt ...

  8. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

  9. 《PHP开发APP接口》笔记

    PHP开发APP接口 [TOC] 课程地址 imooc PHP开发APP接口 学习要点 APP接口简介 封装通信接口方法 核心技术 APP接口实例 服务器端 -> 数据库|缓存 -> 调用 ...

随机推荐

  1. 20190903 - CSDN 的奇葩替换

    可能是出于安全原因 CSDN 对内容中的代码,作了很多奇葩的替换. 比如下面两行,是否有差别? # - # -16 有.其实 cut 后的短横线,内部编码不同,前者复制后无法被识别. 再比如下面两个词 ...

  2. Metasploit-初篇

    Metasploit metasploit 是一款开源的安全漏洞检测工具 渗透测试的操作系统 无需赘言,kali Linux发行版是目前最流行的安全操作系统;基于Debian的操作系统附带了600多个 ...

  3. python 之魔法方法

    描述符就是将某种特殊类型的类的实例指派给另一个类的属性 例如下面的示例 class MyDecriptor(): def get(self,instance,owner): print("g ...

  4. day33 网络编程之UDP与进程了解

    UDP 什么是UDP协议 在上节课的练习中,使用TCP进行网络编程时,我们会遇到粘包问题,这是因为TCP是流式协议,而今天学习的UDP协议不是流式协议,其发送的数据是数据报格式的,在进行数据发送时该协 ...

  5. Go基础:函数多返回值特性

    之前在写Python程序的时候,惊叹于它支持多返回值的特性带来的便利性.在学习Go的时候,发现Go也拥有多返回值的特性. 1.基本用法 创建一个多返回值的方法: func getACar() (bra ...

  6. Java判断指定日期是否为工作日

    Java判断指定日期是否为工作日 转自:https://www.jianshu.com/p/966659492f2f 转:https://www.jianshu.com/p/05ccb5783f65转 ...

  7. 桥接模式下访问虚拟机中的Django项目

    首先需要保证主机和虚拟机能相互Ping通,如果Ping不通,请参考我上篇文章,这里演示的是桥接模式下的方法,如果是NAT模式连接,请参考别处. 1. 虚拟机Linux系统内的Django项目 sett ...

  8. Hadoop部署(伪分布式系统)

    hadoop安装 #修改主机名 hostnamectl set-hostname hadoop #修改hosts vim /etc/hosts #追加到末尾 10.0.0.11 hadoop 安装必备 ...

  9. Luogu P2495 [SDOI2011]消耗战

    题目 我们可以很快的想到一个单次\(O(n)\)的dp. 然后我们注意到这个dp有很多无用的操作,比如一条没有关键点的链可以直接去掉. 所以我们可以尝试一次dp中只管那些有用的点. 题目给的关键点显然 ...

  10. div布局(持续更新)

    1. 效果: 代码: <!DOCTYPE html> <html> <head> <meta name="viewport" conten ...