在对于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. java数据结构之LinkedHashMap

    一.LinkedHashMap源码注释 public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map& ...

  2. go爬虫系列

    一.go语言爬取豆瓣电影top250 package main import ( "net/http" "io/ioutil" "os" & ...

  3. Comparator接口实现排序

    对任意类型集合对象进行整体排序,排序时将此接口的实现传递给Collections.sort方法或者Arrays.sort方法排序.实现int compare(T o1, T o2);方法,返回正数,零 ...

  4. BTree B+Tree

    简介 B 树是为了磁盘或其它存储设备而设计的一种多叉平衡查找树.(相对于二叉,B树每个内结点有多个分支,即多叉)B树又可以写成B-树/B-Tree,并不是B“减”树,横杠为连接符,容易被误导首先我们介 ...

  5. octave

    1. octave, 如何求一元二次方程的解: 例如:· -3x-9y=18  ·   4x+3y=12 命令: >>>  A=[-3 -9; 4 3]; B=[18;12]; &g ...

  6. Tcpdump移植

    摘要: tcpdump对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析.它支持针对网络层.协议.主机.网络或端口的过滤,并提供and.or.n ...

  7. Android开发自定义View

    Android中View组件的作用类似于Swing变成中的JPanel,它只是一个空白的矩形区域,View组件中没有任何内容.对于Android应用的其他UI组件来说,它们都继承了View组件,然后在 ...

  8. Lucky Sorting(CodeForces-109D)【思维】

    题意:给出一组数,要求从小到大排序,并且排序的过程中,发生交换的两个数至少一个为幸运数(十进制位均为4或7),问能否在(2×n)次交换内完成排序,如果能,输出交换的方案(不要求步骤数最少). 思路:首 ...

  9. linux内核编程入门 hello world

    注意: Makefile 文件的命名注意M需要大写,否则会报错. 在Makefile文件中make命令前应为tab制表符. 下文转载至:https://blog.csdn.net/bingqing07 ...

  10. iview给布局MenuItem标签绑定点击事件

    @click.native="menuHandleClick"