API开发之接口安全(三)----sign有效时间
之前生成的sign和校验sign我们已经完全掌握了、但是仅仅凭借这样的sign是无法满足我们的需求的,如果一个黑客通过抓包抓到你的数据 他可以去修改你的header为这样的 body为那样的 也是可以通过sign校验的 那么我们怎么解决呢 下面将详细的 为大家解说
首先想到这样的一个问题 我么首先应当考虑到的就是sign的时效性问题 如果 我们的sign只有十秒的时间 那就算抓包 他也只能在这十秒里使用 那么有了这个想法之后 我们是否应当在 生成sign之前加入 time参数呢 这个time具体怎么加入呢?
我们先建立一个 Time 类 来生成我们sign所需要的time
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2019/8/16 * Time: 10:20 */ namespace app\common\lib; /*** * 生成以时间戳拼接的13位字符串 * Class Time * @package app\common\lib */ class Time { public static function get13TimeStamp(){ list($t1, $t2) = explode(\' \', microtime()); ##*1000增加唯一性 避免重复 return $t2 . ceil($t1*1000); } }
创建好我们时间生成类之后 我们需要在 生成sign的时候加入 time 参数
\'time\' => Time::get13TimeStamp(),
然后生成sign
IAuth::setSign($data)
生成之后 我们就会获得到 加入 time 参数之后 返回的 sign了
下来我们拿到这个sign之后进行校验
我们需要修改下我们的校验方法 checkSignPass 使time参数参与进来
新增判断
##乘除1000增加唯一性 if((time() - ceil($arr[\'time\']/1000)) > config(\'app.app_sign_time\')){ return false; }
其中 config(“app.app_sign_time”) 是我在配置文件中配置的
return [ \'aeskey\' => \'asdasd4wq5646\', #AES秘钥 服务端必须和客户端保持一致 \'method\' => \'AES-128-ECB\', \'iv\' => \'\', \'options\' => \'0\', \'app_types\' => [ \'ios\', \'android\', ], \'app_sign_time\' => 60, ];
这样 我们就成功的将时间加入到了 sign 中 但是 这样的话 还是不能保证我们数据的 安全性 我们需要进一步的 是sign有更高一级的安全性(唯一性)才行 那么怎么做呢 下章我们继续解刨sign