2019独角兽企业重金招聘Python工程师标准>>>

公钥加密私钥解密是密送,保证消息即使公开也只有私钥持有者能读懂。

私钥加密公钥解密是签名,保证消息来源是私钥持有者。

数字签名只能验证数据的完整性,数据本身是否加密不属于数字签名的控制范围

CS

C客户端,S服务器端

在客户端软件发布前,客户端保存一个公钥,服务器保存一个私钥;客服端and服务器都保存一个固态key : solid_key

步骤1:

客户端随机生成一个对称密钥,称为动态key : dynamic_key,使用公钥加密内容(dynamic_key+账户+密码+其他需要的参数)。发送给服务器

步骤2:

服务器收到后使用私钥解密,并验证用户和密码是否正确,正确的话保存此dynamic_key在用户的信息中(如果原先已经有了dynamic_key就替换掉旧的); 返回数据:包括客户端登录成功的信息,返回一个Token(令牌,以后见牌如见人)和其他需要返回的参数(传输过程中不携带uid,用token标识用户唯一身份,更安全)。

步骤3:

使用本地保存的dynamic_key解密得到token和其他参数。 安全传输准备工作做完了。

步骤4:

每次传输数据对于加密的内容一律使用dynamic_key进行加密,按照协商好的签名规则进行签名signature(需要dynamic_key参与到签名规则中,以保障安全),并附以明文参数token、明文参数signature、密文参数params这三部分,然后把此内容发送给服务器。

signature = sha1(rawData + dynamic_key),服务器利用用户对应的 dynamic_key 使用相同的算法计算出签名 signature2 ,比对 signature 与 signature2 即可校验数据的完整性。 (貌似在数据全部加密的情况下,不需要签名的)

步骤5:

根据token找到保存的dynamic_key,然后进行解密(dynamic_key仅仅用来解密,对于解密的内容无法验证),然后根据签名规则验证签名;查看token是否匹配,如果匹配的话那么此次请求就是有效的,否则无效,需要重新登录;如果验证签名失败,直接返回错误。

更新公钥通知服务

服务器端首先需要用原来的私钥签名,客服端有原来的公钥验证签名,如果签名通过,客服端方可更新公钥;签名不通过,需要重新下载最新客户端安装包(包含新的公钥);

如果被网络截获,还需要知道固态key,才能够修改客户端本地公钥

优点:

安全性,除非入侵服务器拿到私钥,或者破解久经考验的非对称加解密算法,没有其他办法大规模攻破,相比其他单纯使用对称加密和非对称加密方法效果都要好。

缺点:

用户第一次握手验证时使用非对称加密的内容,服务器非对称解密消耗资源比较多,如果攻击者发送大量此类信息,容易导致服务器DDoS攻击。个人觉得暂时无法从根本上避免这个问题的发生,只能够加上一些措施增加其难度,从而过滤掉一部分攻击者,具体措施有很多种,比如自己软件写个加密算法,服务器会根据解密算法进行计算从而验证是否有效,再比如android的话把这些算法写在jni层,增加反编译破解的难度。

其他

下表解决“根据token获取对应用户uid”在redis中如果做持久存储的话,token失效无法被有效清除,导致占用内存的风险;

CREATE TABLE `lee_user_token` (`uid` int(11) NOT NULL DEFAULT '0' COMMENT '用户UID',`token` char(36) NOT NULL COMMENT 'uuid 生产的36位字符串',PRIMARY KEY (`uid`),UNIQUE KEY `i_token` (`token`,`uid`) USING BTREE
) ENGINE=MEMORY DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='这里只是存储 token 与 uid 的映射关系,不做登录过期有效性判断';

参考信息:

  • http://segmentfault.com/q/1010000000156701
  • http://baike.baidu.com/view/356572.htm
  • http://baike.baidu.com/view/1982056.htm#2
  • http://www.dewen.org/q/2005
  • https://mp.weixin.qq.com/debug/wxadoc/dev/api/signature.html

转载于:https://my.oschina.net/leeyisoft/blog/1828736

移动客户端与服务器端安全通信方案相关推荐

  1. C-V2X车联网安全通信方案研究

    [摘  要]C-V2X车联网通信需要解决的关键问题是可信身份认证和安全通信,对主流非对称密码技术和SIM认证技术进行分析和研究,并结合当前技术和标准发展现状,提出一种SIM认证与IBC密码技术相结合的 ...

  2. 聊聊WebRTC网关服务器1:如何选择服务端端口方案?

    <聊聊WebRTC网关服务器>系列文章系由WebRTCon2018中网易云信音视频技术专家的分享内容<从零开始构建音视频网关服务器>整理而成,该系列文章将和大家分享网易NRTC ...

  3. Vue SSR技术方案落地实现—构建同构应用

    Vue SSR技术方案落地实现-构建同构应用 一.基本知识扫盲 1.何为服务器端渲染? 1).服务器端渲染:这种技术方案在前端领域处于蛮荒时代就已出现,当时的解决方案主要是后台开发通过模板引擎来设计( ...

  4. Socks5 代理协议

    文章目录 1. 基本概念 2. 部署流程 1. 基本概念 Socks 是一种会话层代理协议,设计的最初目的是帮助授权用户突破防火墙的限制,获取普通用户不能访问的外部资源.考虑到几乎所有基于 TCP/I ...

  5. Android毕业设计-微圈

    去年做了一个类似于我的朋友圈的项目,主要功能就是用户可以实时发表自己的动态,好友可以评论点赞什么的,可以建群,聊天啊,拉黑啊,反正是一个不错的社交软件,包含服务端和客户端,服务端是jsp,客户端不用说 ...

  6. acegi,IBM的Acegi Security System(1)

    使用 Acegi 保护 Java 应用程序,第 1 部分: 架构概览和安全过滤器 使用 Acegi Security System 实现基于 URL 的安全性 文档选项 打印本页 将此页作为电子邮件发 ...

  7. Django学习笔记(10)——Book单表的增删改查页面

    一,项目题目:Book单表的增删改查页面 该项目主要练习使用Django开发一个Book单表的增删改查页面,通过这个项目巩固自己这段时间学习Django知识. 二,项目需求: 开发一个简单的Book增 ...

  8. html新增了哪些功能,HTML5相比HTML新增了哪些功能?

    1. 简化的语法 HTML5简化了很多细微的语法,例如doctype的声明,你只需要写就行了.HTML5与HTML5,XHTML1兼容,但是与SGML不兼容. 2. 更加语义化标签(开发者可以更加优雅 ...

  9. asp.net session 如何知道是哪个浏览器客户端_微服务下的分布式session管理

    享学课堂特邀作者:老顾转载请声明出处! 前言 今天老顾带着大家了解一下session会话在微服务架构中采用的技术方案,以及 企业应用中需要注意的问题. session作用 我们知道在web应用中,we ...

最新文章

  1. python 列表、字典转json字符串
  2. 判断一个数是否是2的倍数----------面试算法
  3. java句子中找单词_java程序找到一个句子中每个单词的字母数
  4. linux+路由器信号检测工具,Linux下常用网络故障调试工具介绍之Ping命令使用
  5. linux 自定义vi dd,Vim常用命令及配置方案
  6. graphviz python_工具推荐|我是如何使用Python脚本分析CPU使用情况的?
  7. 下面这些是什么意思:@classmethod, @staticmethod, @property?
  8. node.js入门及安装
  9. ios虚拟机安装(二)
  10. HTML5七夕情人节表白网页(全屏七夕表白页面滚动模板) HTML+CSS+JavaScript
  11. YonBIP—助力企业数字化转型之道
  12. matlab2016对硬件要求,matlab2016b配置libsvm的各中坑及解决办法
  13. 使用sql语句对数据库脱敏
  14. 概率论中几个入门公式
  15. Setup Factory 提示 Invalid start mode : archive filename 的解决办法
  16. 2022年全球与中国对位芳纶和间位芳纶行业产销需求与投资预测分析报告
  17. duplicate key java,Duplicate key or integrity
  18. 通信协议:分辨率和偏移量的使用
  19. tf.transpose详解(能懂版)
  20. MATLAB中cla函数

热门文章

  1. Hadoop组件基本操作
  2. [Bugku CTF——Pwn] pwn1
  3. mysql integrityerror_mysql插入数据报错IntegrityError: (1062, Duplicate entry 'xx' for key 'xxxxx')...
  4. 一步一步部署SSIS包图解教程1
  5. HDU 6175 算术
  6. 鲁迅散文——随感录三十五
  7. HDU - 4348 To the moon
  8. 洛谷P1352 没有上司的舞会(树形DP水题)
  9. Unity(四)IocContainer 封装类库
  10. 《JavaScript高级程序设计》读书笔记 ---if语句