后端开发:APP与后端交互的安全性

声明

此文原创,未经允许,禁止转载,可以分享。

最近在做一个项目,是一个APP的后端开发。我需要完成后端框架的建立、数据库设计、后端代码的编写。在这里讲一下APP与后端交互的安全性。

没有AUTH的验证

最简单的验证机制是通过session来存储认证信息的,但这个不便于客户端存储,而且有不能跨域请求认证的缺点。

大致流程:

  • 用户登录(输入账户密码)
  • 后端验证
  • 验证通过则在session存储用户ID

每个用户经过我们的应用认证之后,我们的应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大。

Basic 认证方式

传统的认证方式就是构造一个字符串,这个字符串里面含有账户名和密码,比如:

$str = "username:password";

如果希望它不可读,可以对其进行base64编码:

$str = "username:password";
$token = base64_encode($str);
echo $token;
dXNlcm5hbWU6cGFzc3dvcmQ=

这样每次请求API的时候加上这个Token值,然后后端获取到这个Token值,对其进行:

$str = base64_decode($token);
$auth = explode(':', $str);
var_dump($auth);

然后使用auth到数据库中进行查询来验证有效性。

但缺点很明显:

  • 被窃取的可能性:每次使用这个token值进行请求,意味着每次请求都在泄露用户的密码。
  • 增加数据库工作量:每次请求都要去数据库查询是否有效,效率明显下降。

对于传统的AUTH方式做了改进,引入JWT。

JWT认证机制
什么是JWT?

Json web token (JWT), 是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。

它的核心就是签名。比如我有一个字符串。

$str = "qq:792598794;name:sungod";

我该怎么验证这是我给的字符串呢?
方法很简单,对这个字符串和一个密钥,一起进行不可逆运算

echo md5($str . 'KEY');
echo sha1($str . 'KEY');
echo crypt($str, 'KEY');

假如我们使用sha1算法对其进行不可逆运行,得到:

81a2453b89cb914c2208a37e3ca4e4f26c44fe43

然后我们将这个结果放入到$str

$str = "qq:792598794;name:sungod;auth=81a2453b89cb914c2208a37e3ca4e4f26c44fe43";
echo base64_encode($str);
cXE6NzkyNTk4Nzk0O25hbWU6c3VuZ29kO2F1dGg9ODFhMjQ1M2I4OWNiOTE0YzIyMDhhMzdlM2NhNGU0ZjI2YzQ0ZmU0Mw==

这样,如果KEY只有我知道(前提是肯定只有我知道),那么我敢说这个字符串一定是我给的。

利用这个,我们前人总结出了一个规范JWT。

JWT流程
  • 客户端使用账户密码进行签名请求
  • 服务器验证账户密码是否有效
  • 通过验证服务器返回一个Token
  • 客户端存储这个Token,并每次请求都携带
  • 服务器接收到需要验证的请求,验证客户端发来的Token

这个Token可以放在请求头、Cookie、GET、POST,看具体的业务逻辑需要。

如何正确的构造JWT

在PHP中,我们需要一个数组,这个数组用来存储用户的主要信息

$data = [
        'uid'      =>  10000,
        'exp'      =>  time() + 3600,
    ];

uid 表示用户的ID,键值尽量不要取得太长uid三个字符刚好。
exp 表示这个Token什么时候失效,这里是当前时间的1小时后。

对于一个数组,我们不能把它进行不可逆运行,需要将其转换一下。

// 转换为json字符串
$data = json_encode($data);
// 转换为base64编码
$data = base64_encode($data);
echo $data;

最后我们数组成为了一个字符串,每次都不一样,因为有时间在变化

eyJ1aWQiOjEwMDAwLCJleHAiOjE1MDI2ODQ3MjF9

我们这这个字符串与KEY进行不可逆运行(签名),使用PHP自带的函数,它可以很友好的将我们的 data 进行不可逆运行,有关sha1

$auth = sha1($data . "KEY");
echo $auth;

得到的签名

eb96a0b2df742f89192f40191122845b32fc7d01

将其和经过base64转换的数组信息进行拼接

eyJ1aWQiOjEwMDAwLCJleHAiOjE1MDI2ODQ3MjF9:eb96a0b2df742f89192f40191122845b32fc7d01

最后将其base64编码

ZXlKMWFXUWlPakV3TURBd0xDSmxlSEFpT2pFMU1ESTJPRFEzTWpGOTplYjk2YTBiMmRmNzQyZjg5MTkyZjQwMTkxMTIyODQ1YjMyZmM3ZDAx

这样我们就可以使用此字符串作为Token来和后端进行交互了。

注意

data数组中不能存放敏感的信息,因为传统的base64编码是可以在客户端解开的。

在此,我们可以自定义一个base64编码,加一个key来进行base64。

下面利用base64修改的一个对称加密方案:

// 自定义Base64编码
function my_base64_encode($data, $key) {
    $str_arr = str_split(base64_encode($data));
    $str_count = count($str_arr);
    foreach (str_split($key) as $key => $value) {
        $key < $str_count && $str_arr[$key] .= $value;
    }
    return join('', $str_arr);
}

// 自定义Base64解码
function my_base64_decode($data, $key) {
    $str_arr = str_split($data, 2);
    $str_count = count($str_arr);
    foreach (str_split($key) as $key => $value) {
        $key <= $str_count  && isset($str_arr[$key]) && $str_arr[$key][1] === $value && $str_arr[$key] = $str_arr[$key][0];
    }
    return base64_decode(join('', $str_arr));
}

使用相同的key进行对称加密,即使别人获取到了Token,也不清楚里面的构造,利用时间换了安全性。

我们利用my_base64_encode对Token进行加密

eyJ1aWQiOjEwMDAwLCJleHAiOjE1MDI2ODQ3MjF9:eb96a0b2df742f89192f40191122845b32fc7d01

得到:

ZtXolkKeMnW_FsXaUlWtlPakV3TURBd0xDSmxlSEFpT2pFMU1ESTJPRFEzTWpGOTplYjk2YTBiMmRmNzQyZjg5MTkyZjQwMTkxMTIyODQ1YjMyZmM3ZDAxCg==

好了!

这是我做后端学到的知识,我认为还是不错的,分享给大家!
写的有不好,或者有问题的地方,欢迎更正!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容