api设计 - php 接口 token 数据加密
最近在用php写app的接口,有一些疑问
首先关于token(令牌)
token是用户登录的时候生成的
用户token在服务端保存入库 客户端则缓存在本地 大部分接口都要求客户端发送token 和服务端数据库中的token进行验证
每个用户唯一token 是由 年月 和 客户端机器码标识 用户id 组成的
(年月是做登录保存期限用的 机器码是在持保证用户下次登录时,快捷识别登录来源,判断是否需要重新登录的重要凭证,用户id其实是顺便加的)
问题来了
=。= 这东西感觉做出来就和session没什么区别
**如果直接抓一下包
每个用户通一个平台的客户端的token都是一样的 对于防攻击并没有什么用**
而且这种token是基于用户的 所以用户的登录 注册验证(防机器人)验证上这种token是帮不了忙的
=。=我还在再设计一个啥 来验证 (有办法在这种token思路上 把登录注册验证也做了吗)
回复内容:
最近在用php写app的接口,有一些疑问
首先关于token(令牌)
token是用户登录的时候生成的
用户token在服务端保存入库 客户端则缓存在本地 大部分接口都要求客户端发送token 和服务端数据库中的token进行验证
每个用户唯一token 是由 年月 和 客户端机器码标识 用户id 组成的
(年月是做登录保存期限用的 机器码是在持保证用户下次登录时,快捷识别登录来源,判断是否需要重新登录的重要凭证,用户id其实是顺便加的)
问题来了
=。= 这东西感觉做出来就和session没什么区别
**如果直接抓一下包
每个用户通一个平台的客户端的token都是一样的 对于防攻击并没有什么用**
而且这种token是基于用户的 所以用户的登录 注册验证(防机器人)验证上这种token是帮不了忙的
=。=我还在再设计一个啥 来验证 (有办法在这种token思路上 把登录注册验证也做了吗)
此问题简单至极,以php举例。
但和session
不一样,和cookies
有点接近,设计这个是为了解决cookies传值麻烦的问题。
首先在登陆的过程中,用户向服务端提交数据应有username
、password
、client_key
php在服务端拿到这些数据之后,用校验算法获取校验值,如md5
。
(ps:不加密码是不行的,否则用户修改密码后之前的还是可以快捷登陆,这不坑人吗)$salt
是一个加密key
,防止别人猜到加密算法。
$token=md5($username.$password.date('yyyy').date('mm').$client_key.$salt);
计算完成后将$token
返回到客户端,作为存储。以后客户端只需要向服务端发送此$token
和用户名。
当php收到这个$token
就再做一次上面的运算,看是否一致即可快捷判断。
如果需要防止恶意注册和登陆,就需要在客户端对client_key
进行加密,然后服务端解密做验证,然而这并没有什么卵用,一切客户端的代码都是不安全的,可以通过反编译,反混淆来分析,然后照样伪造。所以客户端的加密没有意义。
另外,服务器通过ip判断也是一个办法。
然而,从根源上来讲,防止恶意攻击就需要验证手机号才能注册,目前基本上通过此种方法实现。
我也在写,还没有实现
1.如果用户是通过token验证登陆的,在app上也就是类似cookie的东西,用户拿来登陆是没什么问题,如果是当用户换客户端登陆,则需要重新登陆,那在验证的时候再获取客户端机器码匹配一下.
另外客户端的token也可以做复杂,用js进行加密处理,在php获取再进行解析.
虽然token在一定程度上是不安全的,但是相比较,比传递用户密码来的安全。
使用token的场景一般是无状态无cookies的模式,如果有token充当cookies中的sessionID的作用。
token虽然不安全,但是由一定程度的验证模式,那么还是可以使其可信的
刚好前不久自己写了篇博客,虽然没有涉及到一些技术细节,但思路还是有的,看看对你有没有帮助吧。
首先你要明确,Token
是用于登录后验证身份的,所以一开始就否决了你期待用它来做防恶意注册,这两者完全不搭嘎。其次,要说Token
与Session
有什么区别,那区别就在于Token
更具有定制型,因为它是由你实现的,就能干很多Session
不方便干的事情,比如更好的做设备认证,更方便的控制有效期,更好的跨平台性……最重要的,HTTP协议本身定义就是无状态的,而Cookie
这种东西的存在无疑有损无状态这个定义,所以几乎所有的接口都拒绝使用Cookie
,弃了Cookie
,那Token
自然成了验证的首选。最后,Token
的安全性着重于其不会被破解,不会被篡改,而不在于它传输时会不会被截取造成中间者攻击。截取的防护应该是由你加强传输过程中的安全性来实现的,比如增加参数签名,或者直接上HTTPS。
api设计 - php 接口 token 数据加密的更多相关文章
- Yii2 Restful api设计--App接口编程
Yii2框架写一套RESTful风格的API,对照魏曦教你学 一,入门 一.目录结构 实现一个简单地RESTful API只需用到三个文件.目录如下: frontend ├─ config │ └ m ...
- 前后端分离&接口API设计学习报告
接口API设计学习报告 15331023 陈康怡 什么是API? API即Application Programming Interface.API是一种通道,负责一个程序与另一个程序的沟通.而对于w ...
- 我是如何根据豆瓣api来理解Restful API设计的
1.什么是REST REST全称是Representational State Transfer,表述状态转移的意思.它是在Roy Fielding博士论文首次提出.REST本身没有创造新的技术.组件 ...
- API接口TOKEN设计
首先需要知道API是什么? API(Application Programming Interface)即应用程序接口.你可以认为 API 是一个软件组件或是一个 Web 服务与外界进行的交互的接 ...
- 使用Flask设计带认证token的RESTful API接口
大数据时代 Just a record. 使用Flask设计带认证token的RESTful API接口[翻译] 上一篇文章, 使用python的Flask实现一个RESTful API服务器端 简 ...
- effective OC2.0 52阅读笔记(三 接口与API设计)
第三章:接口与API设计 15 用前缀避免命名空间冲突 总结:避免重名符号错误的唯一办法是变相实现命名空间.为所有符号都加上命名前缀.类和分类都应加三字前缀.注意类实现文件中的纯C函数及全局变量,是算 ...
- 组件接口(API)设计指南-文件夹
组件接口(API)设计指南-文件夹 组件接口(API)设计指南[1]-要考虑的问题 组件接口(API)设计指南[2]-类接口(class interface) 组件接口(API)设计指南[3]-托付( ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)RESTful API实战笔记(接口设计及Java后端实现)
写在前面的话 原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做: 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的. 而且这次 ...
- api接口token验证
接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非开放性的,所以OAuth那套协议是行不通的,因为没有中间用户的授权过程: 3.有点接口需要用户登录 ...
随机推荐
- 蓝桥杯 算法提高 学霸的迷宫 经典BFS问题
算法提高 学霸的迷宫 时间限制:1.0s 内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城 ...
- 《Science》:对年轻科学家的忠告
- Java并发编程原理与实战三十九:JDK8新增锁StampedLock详解
1.StampedLock是做什么的? ----->它是ReentrantReadWriteLock 的增强版,是为了解决ReentrantReadWriteLock的一些不足. 2.Ree ...
- laravel带条件查询手动分页
后台php代码: //手动分页 $users = $kaoqin; //打算输出的数组,二维 $perPage = 10; if ($request->has('page')) { $curre ...
- Uva 11549 - Calculator Conundrum 找规律加map
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 信息安全学习笔记--CSRF
一.CSRF简介 CSRF(Cross-site request forgery)跨站请求伪造,也被称为“one click attack”或者“session riding”,通常缩写为CS ...
- Java枚举类型的用法
JDK1.5引入了新的类型——枚举.在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便. 1.用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fia ...
- 用C代码简要模拟实现一下RPC(远程过程调用)并谈谈它在代码调测中的重要应用【转】
转自:http://blog.csdn.net/stpeace/article/details/44947925 版权声明:本文为博主原创文章,转载时请务必注明本文地址, 禁止用于任何商业用途, 否则 ...
- MySQL 高可用:mysql+Lvs+Keepalived 负载均衡及故障转移
系统信息: mysql主库 mysql从库 VIP 192.168.1.150 mysql 主主同步都设置 auto-increment-offset,auto-increment-increment ...
- 两个Bounding Box的IOU计算代码
Bounding Box的数据结构为(xmin,ymin,xmax,ymax) 输入:box1,box2 输出:IOU值 import numpy as np def iou(box1,box2): ...