java服务端开发安全_后端开发: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==
好了!
这是我做后端学到的知识,我认为还是不错的,分享给大家!
写的有不好,或者有问题的地方,欢迎更正!!
java服务端开发安全_后端开发:APP与后端交互的安全性相关推荐
- 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互
基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互 一.前言 1.Java服务端程序代码的项目名为TcpSocketServerOfJava,包名为com.exam ...
- java服务端集成极光消息推送--详细开发步骤
1.极光推送账号准备 要使用极光消息推送必须先在官方网站上注册账号,并添加应用. 产品介绍:https://docs.jiguang.cn/jpush/guideline/intro/ 注册开发者账号 ...
- java 服务端渲染_基于vue-ssr服务端渲染入门详解
第一部分 基本介绍 1.前言 服务端渲染实现原理机制:在服务端拿数据进行解析渲染,直接生成html片段返回给前端.然后前端可以通过解析后端返回的html片段到前端页面,大致有以下两种形式: 1.服务器 ...
- springboot中service中注入dao失败测试类中注入成功_聊一聊 Java 服务端中的乱象
查尔斯·狄更斯在<双城记>中写道:"这是一个最好的时代,也是一个最坏的时代." 移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动:随着行业竞争加剧,互联网红利 ...
- 那些年,我们见过的 Java 服务端乱象
点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 Photo by The Book Tutor @Youtube 文 | 陈昌毅 导读 查尔斯 ...
- 人人都能掌握的Java服务端性能优化方案
转载自 人人都能掌握的Java服务端性能优化方案 作为一个Java后端开发,我们写出的大部分代码都决定着用户的使用体验.如果我们的代码性能不好,那么用户在访问我们的网站时就要浪费一些时间等待服务器的响 ...
- 谷歌支付(Java服务端)
Google Pay主要支付流程 1.手机端向Java服务端发起支付,生成预订单,给手机端返回生成的订单号 2.手机端向Google发起支付(传入本地服务器生成的订单号) 3.Google服务器将支付 ...
- Flex通信-Java服务端通信实例
Flex与Java通信的方式有很多种,比较常用的有以下方式: WebService:一种跨语言的在线服务,只要用特定语言写好并部署到服务器,其它语言就可以调用 HttpService:通过http请求 ...
- 聊一聊 Java 服务端中的乱象
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:阿里巴巴中间件 查尔斯·狄更斯在<双城记>中写道 ...
- 那些年,我们见过的 Java 服务端“问题”
导读 明代著名的心学集大成者王阳明先生在<传习录>中有云: 道无精粗,人之所见有精粗.如这一间房,人初进来,只见一个大规模如此.处久,便柱壁之类,一一看得明白.再久,如柱上有些文藻,细细都 ...
最新文章
- vs mfc数据与控件绑定错了_如何进行数据趋势分析?VS扩展工具——C1迷你图控件了解一下...
- 返回的到的数据做整合_成功的整合营销有哪些秘诀
- 从龙门镖局看自动化测试
- mysql 5.5.41 下载_MySQL 5.5.41/5.6.22 发布下载
- 基于ArcEngine的插件式框架
- python创建dataframe表格不显示_创建列pandas DataFrame数据的表绘图时出现问题?
- Java BigInteger类| bitCount()方法与示例
- EntityFramework Core映射关系详解
- eve星战前夜登录提示服务器维护中,EVE星战前夜进不去怎么办 游戏进不去问题解决方法...
- css的img移上去边框效果及CSS透明度
- qq纯黑主题怎么设置_qq背景变黑色,怎么调过来
- ubuntu16.04下ROS操作系统学习笔记(七 )机器语音-语音听写-科大讯飞SDK调用
- 工业循环冷却水处理设计规范_循环冷却水系统及其水处理
- l298n电机哪一端为正_L298N是如何控制直流电机正反转的
- python做数字识别_用python实现手写数字识别
- Office 右键新建没有office选项怎么办
- 楼市泡沫雪崩为何十倍“猛于”A股大跌
- 使用fisheye4.8(crucible4.8)添加仓库时出现的问题
- Linux上采用rdtsc指令对C/C++程序进行性能测试
- 大数据工程师岗位JD中最常出现的技能