如何构建安全的App网络通信?

前言

    说到安全肯定逃不开数据的加解密,数据本地存储大多用对称加解密来实现,那网络传输数据的时候是不是也用对称加解密来实现?没错,常规网络通信时,大部分网络传输过程中基本也是用对称加解密来实现的,毕竟时间宝贵。如果使用非对称加密方式,需要花N多时间等数据加密后传输出去,或者解密出来。只是用对称加解密有个致命问题就是密钥Key的交换,毕竟网络是一个不可靠加不安全的通信环境。这个时候就需要启用另外一种加解密方式——非对称加解密。

    不过想要做出一个安全的加密通信信道不是简单的用个对称加密和非对称加密可以完成的。在说网络安全之前,我们先讲几个比较基础的概念。

1.1 单向函数

    第一个要说的就是“单向函数”。假设现在存在一个函数,函数式为f(X)=Y。输入X,很容易就能得出结果Y。但是在知道结果Y,想反向算出输入值X时非常困难(就是用现有最快的计算机来计算,也得计算个几百上千年才能得出结果的这种)。这种函数就叫单向函数。其中最简单的就是整数相乘。例如3*7=21;知道21,很容易就能猜出来,可能的结果有【1,21】、【3、7】这两组。但是将整数的位数提高到几百位,就很难反推出来。

由此也能很容易的看出来单向函数不能用于数据加密。因为经过单向函数加密的数据谁都不能解开,用它来加密数据没有任何意义。单向函数一般两个用途:1、生成信息摘要,或者数据指纹。比如说我们非常熟悉的MD5、SHA1算法就是具有单向函数性质的摘要算法。2、密码保护。一般用户登录时给服务器提交明文密码是非常危险的,非常容易被抓包。就算千幸万苦的提交到服务器端,服务器端保存不当照样会造成用户密码泄漏。此时就需要将用户密码经单向函数计算,然后将计算出的函数值存储在服务器端。用户登录时,客户端只需要提交用户密码计算出的函数值,服务器端用接收到的函数值和本地存储的值进行对比即可。

1.2 单向陷门函数

    单向限门函数是一类特殊的单向函数。是一类存在“陷门”或者说“后门”的单向函数。还是上文提到的单向函数f(x)=y,已知函数计算方法和输入值x时非常容易计算得到结果y,但是反向不能计算。此时如果再提供一个参数、或者数据Z,就可以通过y反向计算出输入值X。这个Z就被称为后门或者说陷门。例如下图的利用RSA算法对数据进行加解密的过程中,私钥就可以被看做是“后门”。

图片

1.3 前向加密安全

    这个概念说的是:在一个加密通信信道中,用来产生会话的长期加密密钥泄漏,不会造成之前通讯密钥的泄漏。比如说在这个加密信道中发送了A、B、C、D、E五次网络请求,在第五次E的时候密钥被破解,第五次请求E被破译为明文。此时以后的请求G、H很难保证安全,但是之前的ABCD四次网络请求仍然无法被破译,还是安全的。

1.4 非对称加密

    非对称加密算法有两个密钥,因为加密解密用的不同的密钥,所以就叫非对称加密。两个密钥,一个公布出去叫公钥,一个自己保留叫私钥。用公钥加密的数据,只有对应的私钥可以解密。用私钥加密的数据,也只有对应的公钥才可以解密。下图就是一个典型的公钥加密,私钥解密的过程。

图片

非对称加密算法有很多种,除了经常听说的RSA,还有D-H,ECC(椭圆曲线加密算法)等等算法。

网络安全通信

2.1 安全通信第一版

    了解了非对称加密算法,我们很自然地就能设计出一个两端通信的安全加密方案。如下图所示:

图片

    上述方案看似安全和完美,但是也存在一些问题和缺陷。比如性能差,会受到中间人攻击。

2.2 安全通信升级版

    针对性能差,我们可以采用对称加密来解决。中间人攻击,这个时候就需要用到“数字证书”。数字证书的构成内容比较多,包含颁发者、使用者(持有者)、有效期、公钥等等。这里只说几个简单的知识点。

2.2.1 摘要

    将使用者信息(这一栏一般是自身的网站域名和公司名等),自己生成的公钥和其他信息打包一起,经过hash算法计算,生成的hash值就叫做摘要。

2.2.2 签名

    CA证书机构用自己的私钥对摘要进行加密运算,生成加密后的密文,这个密文就被称为是数字签名。

2.2.3 证书

    将2.2.1中的自身信息和摘要,2.2.2步骤中的数字签名放在一起,就称之为数字证书。

下图就是一个签名生成数字证书和验证数字证书是否正确的流程图:

图片

2.2.4 经典的TLS握手过程

    有了数字证书,再加上对称加密算法,我们就可以构建出一个安全的加密通信信道。

  1. 1. 首先客户端生成一个随机数k1,然后和服务器端打招呼并将随机数K1发送给服务器端。

  2. 2. 服务器端拿到K1。自己再生成随机数K2。并且将自身的证书和K2发送给客户端。

  3. 3. 客户端拿到服务器端的随机数K2和证书后,校验证书是否正确。如果校验成功,那继续进行握手。如果失败,会直接终止。

  4. 4. 客户端生成随机数K3,使用从证书中得到的服务器端公钥对K3进行加密。

  5. 5. 服务器端接收数据后,用自己的私钥对其进行解密,从而得到随机数K3。

  6. 6. 两端用三个相同的随机数K1+K2+K3合并生成一个对称加密算法的Key。后续就用这个key来加密两端通信的数据。

图片

网络通信安全在众安APP中的落地

3.1 我们面对的严苛问题

    看完上面安全知识点介绍和两种网络通信安全方案,我们就明白想构建一个安全的网络通信环境是多么的困难。尤其是我们做的金融App,那相对于普通APP安全等级更是严苛。

首先,金融APP不能只是简单的走Https协议而不做证书绑定校验(不做证书检验就会导致”中间人“攻击);

第二,App的网络请求需要配合服务器端做”防重放“处理,防止被人”重放攻击”;

第三,网络请求必须做签名处理,并且签名算法要保密,防止网络请求被篡改;

第四,网络请求数据必须做明文隐藏,防止网络请求被抓包的时候数据被攻击方直接获取;

第五,也是大家比较容易忽视的一点,就是多平台覆盖。很多App都做了网络请求安全防护,协议设计上大多只能兼容ios和android两端,web端就被忽视掉了;

第六,不能只顾安全不顾性能,App的网络通信性能必须兼顾到。

3.2 众安APP中的落地

    所以我们需要一个全面、健壮、能兼顾到上面几个安全问题的方案。

参考TSL协议,相当于在Https请求的基础上再加一道防线,我们设计了众安的网络请求安全协议。

现详细说明一下该方案中的核心四步:

  • • 第一步自然就是采用https协议,挂上证书启用证书校验。此外由于SSL、TSL各个版本的缺陷,我们在服务器端写死了TSL 版本为1.2+。即发起请求的客户端TSL版本必须是1.2或者以上版本,否则在https的握手阶段网络连接就会失败。这一步旨在于有效的防止“中间人”攻击。

  • • 第二步,在每个网络请求的body中都放入一个随机数,后台服务器会在内存中记录这个随机数,并且加一个有效时间。这一步可以有效的防止”重放攻击“。

  • • 第三步,生成一对RSA的公私钥对。公钥放客户端,私钥放服务器端。每个网络请求使用随机算法生成一个随机数Key作为AES算法的key。用AES算法对网络请求的body数据整体进行加密。用公钥对key进行加密,加密后的值放到网络请求的head中。这一步是为了防止body明文泄密。

  • • 第四步,再次加固网络请求,给请求加签名——防篡改。使用header中的字段进行拼接,加入time这类随机数生成签名sign。这一步可以有效的防止网络请求被抓包后篡改。只要我们的签名算法没有泄漏或者被破解,那攻击者就很难篡改我们的网络请求。

下图就是一个完整的网络请求客户端发送,服务器端接收的过程。

图片

其他的App网络通信方案介绍

再简单介绍两种密码登录交互方案供大家参考:

4.1 用户登录密码交互方案

    大部分app都存在使用账号密码登录的情况。在这个时候为了保护用户的明文密码不泄漏,很多app就会采用下面这种或者类似方案来设计用户登录交互。

图片

  1. 1. 首先在客户端对用户的明文密码附加盐值然后用hash算法计算生成密码。(这里之所以附加盐值后再hash是为了防止用户密码被人用彩虹表直接破译出来)

  2. 2. 服务器端准备两张表,当用户注册的时候,一张表用来存储用户提交的hash值密码,一个用来存储给用户生成的UUID随机码。(这里不存储用户明文密码就是为了防止服务器被脱库后,用户明文密码泄漏)

  3. 3. 用户登录的时候服务器端收到用户发来的hash密码,这里称为HashPW1,然后根据用户名查询到对应的UUID。服务器在自己的数据库中根据用户名查询出hash密码,称为HashPW2。接着查询到对应的UUID。

  4. 4. 然后在内存中用(HashPW1+UUID)生成密码1,用(HashPW2+UUID)生成密码2。两个密码相等即登录成功,不相等登录失败。(这里之所以在内存中生成真正的登录密码是为了防止将密码存储在数据库中,有权限的人可以直接查询到。经过这样复杂的操作有查询数据库权限的人只能看见两个hash值,不知道真正的密码如何生成。写代码的人知道密码生成算法,但是没有对应的随机值,都没有能力拿到用户的登录密码)

方案点评:

  • • 优点:该方案的最大优点在于隐藏客户的明文密码。整个系统的开发链上的几个关键角色:客户端开发、运维、后端开发都无法真正知晓客户的明文密码。在客户端,可以有效隐藏明文密码;在数据库中,存储的是客户的两个Hash值,运维无法掌握客户密码;在后端,虽然写后端代码的开发知晓真正的密码如何生成,但是却没有密码生成的两个关键hash值,仍然无法知晓客户的明文密码。

  • • 缺点:该方案缺点也是非常明显,客户端生成客户密码的hash值是固定的。如果被截取到该hash值就相当于被拦截了客户密码。必须在此基础上再加上网络通信安全策略,例如防抓包等策略,进一步加强防护。

4.2 用户交易密码交互方案

    除了登录过程以外还有一种密码使用情况就是交易密码使用场景。理论上6位数字的交易密码也可以采用上面的交互方案,但是由于很多系统都对接了第三方系统,第三方系统只认用户的6位数字密码。也就是说我们还是需要将用户交易密码明文提交到服务器端。这时一般是这样操作的:

图片

  1. 1. 第一步客户端通过API1发起请求到服务器。服务器端会有一个令牌池,令牌池中存储RSA公私钥对和一个随机码。收到用户请求后从令牌池捞出一对RSA公私钥对和随机码,和用户的token或者userId做绑定。

  2. 2. 第二步将绑定后的公私钥对中的公钥和随机码发送给客户端

  3. 3. 第三步客户端收到随机码和公钥后,将6位交易密码拼接随机码,整体用公钥加密生成密文串。客户端再通过API2提交密文串到服务器端。

  4. 4. 第四步,服务器端接收到密文串后,根据用户token或者userId查询到对应的私钥,用私钥解密得到对应的随机码和6位数字密码。随机码校验ok后即可使用交易密码;如果校验失败才用户本次无法使用交易密码。

方案点评:

  • • 优点:算是比较完美的方案,可以用于生产环境

  • • 缺点:系统的后端开发可以拿到用户的明文密码,如果操作不当,有密码泄露的风险。

总结

    对于一个网络App来说,在一个不安全的网络环境中构建一条安全、稳定的网络通信信道非常重要,尤其对于金融App来说更是重中之重。简单地使用https协议并不能解决各种安全漏洞和网络攻击。综上所述,众安在构建自己的网络通信安全信道时进行了全方位的考虑:

  • • 在使用https协议的基础上,进行二次加密安全。即使https协议被破解,攻击者也只能获取到一堆加密过的密文信息。

  • • 网络请求不仅实现了“防篡改”和“防重放”,还采用了“前向加密安全”。每个请求的加密密钥都是独立且动态生成的。即使某一条请求被抓包和破解,也不会影响其他请求的安全性。

  • • 考虑多平台,该安全协议适用于iOS、Android和Web端。

  • • 在设计通信安全的同时,也考虑了与性能的平衡。不仅注重安全性,还优化了通信的性能,确保用户在使用ZA App时能够享受到快速、高效的网络通信体验。

附录

D-H算法

D-H算法全称Diffie-Hellman算法。是一种密钥协商算法,用来在不安全的网络环境中协商出一个统一的加密密钥。但是该方法不能防止中间人攻击。

具体的密钥协商过程可以用下面这个交互过程简单理解一下。

  • • 首先A端和B端公开两个数字P和Q,其中P=5,Q=8。A端和B端各自生成一个随机数Ra=2、Rb=3。并且保证各自会保存好各自的随机码不泄漏。

  • • 接着A端采用公式Ra*P 计算结果X(X=10),B端采用公式Rb * Q 计算结果Y(Y=24)

  • • 双方互换X和Y值。这样A端拿到有Ra,P,Q,Y。B端持有Rb,P,Q,X。

  • • A端采用公式 Ra * P * Y 计算密钥,结果等于240。B端采用公式Rb * Q * X = 240。双方通过协商生成了统一的密钥240。

图片

上面这个过程只是用乘法简单的模拟一下这个过程,具体的D-H算法要复杂的多,而且是采用离散对数来实现的。具体数学原理如下图所示:

图片

本文作者: 谢鹏飞 来自于众安国际ZA Frontend 团队

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/156706.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab论文插图绘制模板第118期—进阶气泡图

之前的文章中,分享过Matlab气泡图的绘制模板: 图虽说好看,但有一个缺点:需要手动调节两个图例的位置。 为了解决这一问题,我们不妨结合前段时间分享的紧凑排列多子图的绘制模板: 从而达到自动对齐排列的效…

Vue3模块找不到问题解决:找不到模块‘vue ‘。你的意思是将“模块解决方案”选项设置为“节点”,还是添加ali

Vue3 vite 项目引入 vue 报错 Cannot find module ‘vue‘. Did you mean to set the ‘moduleResolution‘ option to ‘node‘, or to add ali 在项目中找到 tsconfig.json 文件 找到配置项里的 "moduleResolution": "bundler", 将其改成 &q…

<图像处理> Fast角点检测

Fast角点检测 基本原理是使用圆周长为N个像素的圆来判定其圆心像素P是否为角点,如下图所示为圆周长为16个像素的圆(半径为3);OpenCV还提供圆周长为12和8个像素的圆来检测角点。 相对中心像素的位置信息 //圆周长为16 static c…

前端工程化(editorconfig+ESLint+Prettier+StyleLint+Husky、Commitlint)

前言 致谢:有来技术大大 通过学习有来技术大大的文章和结合自己的实践,写一篇笔记记录一下 所使用的工具: ide项目风格(editorconfig)代码检查(ESLint)代码风格(Prettier)样式风格(StyleLint)git提交规范(Husky、Commitlint) 一、ide项目…

PyTorch模型性能分析与优化

一、说明 训练深度学习模型,尤其是大型模型,可能是一项昂贵的支出。我们可以使用的管理这些成本的主要方法之一是性能优化。性能优化是一个迭代过程,我们不断寻找提高应用程序性能的机会,然后利用这些机会。在之前的文章中&#x…

【TensorFlow2 之015】 在 TF 2.0 中实现 AlexNet

一、说明 在这篇文章中,我们将展示如何在 TensorFlow 2.0 中实现基本的卷积神经网络 \(AlexNet\)。AlexNet 架构由 Alex Krizhevsky 设计,并与 Ilya Sutskever 和 Geoffrey Hinton 一起发布。并获得Image Net2012竞赛中冠军。 教程概述: 理论…

LMI FocalSpec 3D线共焦传感器 使用笔记1

一.硬件介绍 以上特别注意: 屏蔽线必须接地,因为在现场实际调试中,使用软件调试发现经常 弹窗 传感器丢失警告!! 以上 Position LED 的灯被钣金挡住,无法查看异常现象,能否将指示灯设置在软件界面上? 需要确认是软触发还是硬触发,理论上 硬触发比软触发速度要快.(我们目前使用…

文心一言Plugin实战来了,测试开发旅游攻略助手

刚刚过去的8月,百度WAVE SUMMIT 深度学习开发者大会上,重磅发布文心一言的五个原生插件:百度搜索、览卷文档(基于文档的交互)、E 言易图(数据洞察图表生成)、说图解画(基于图片的交互…

【后端】韩顺平Java学习笔记(入门篇)

目前准备学后端,java虽然大二上学了但是基本忘没了orz 争取大三卷一点啊啊啊 九月份写的10月份才发orz 中间摆烂了很久,现在目标清晰准备行动了kkk 来源:韩顺平 零基础30天学会Java 目录 I. 简介 一、特点 ✿ 跨平台性 → 运行机制…

【Linux】提权问题

目录 一、设置白名单 一、设置白名单 当我们在使用sodo的时候,会发现我们的普通用户是无法用这个指令的,这个是因为这个普通用户还没有在root下是白名单里的用户 接下来我们来看一下怎样设置白名单用户 在root下打开配置文件vim /etc/sudoers 找到第100…

【设计模式】使用建造者模式组装对象并加入自定义校验

文章目录 1.前言1.1.创建对象时的痛点 2.建造者模式2.1 被建造类准备2.2.建造者类实现2.3.构建对象测试2.4.使用lombok简化建造者2.5.lombok简化建造者的缺陷 3.总结 1.前言 在我刚入行不久的时候就听说过建造者模式这种设计模式,当时只知道是用来组装对象&#xf…

【算法-动态规划】0-1 背包问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

红队专题-Cobalt strike 4.x - Beacon重构

红队专题 招募六边形战士队员重构后 Beacon 适配的功能windows平台linux和mac平台C2profile 重构思路跨平台功能免杀代码部分sysinfo包packet包config.go命令的执行shell、run、executepowershell powerpick命令powershell-importexecute-assembly 堆内存加密字符集 招募六边形…

【计算机网络笔记】数据交换之电路交换

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 文章目录 系列文章目录为什么需要数据交换数据交换的类型电路交换什么是多路复用?频分多路复用(FDM)时分多路复用(TDM)波分…

vue2.6 和 2.7对可选链的不同支持导致构建失败

有两个vue2项目,构建配置和依赖基本上都一样,但一个可以在 template 模板中使用可选链(?.),另一个使用就报错。 但是报错的那个项目,在另一个同事那又不报错。 已知 node14 之后就支持可选链了,我和同事用的是 node…

如何压缩视频?视频压缩变小方法汇总

视频是我们日常生活中不可或缺的一部分,但视频文件往往会占用大量存储空间,这在传输和分享过程中可能成为一个瓶颈。 为了解决这一问题,我们可以通过压缩的方式减小视频大小,视频压缩是指在保证视频质量的前提下,通过…

池州市的城市环境融合:OLED透明拼接屏展现自然与现代的完美结合

池州是中国安徽省的一个地级市,位于该省的西南部。池州市辖区包括贵池区、东至县、石台县、青阳县等地。 池州市拥有悠久的历史和丰富的文化遗产,同时也以其独特的自然风光而闻名。 首先,让我们来了解一下池州的历史和景点。 池州的历史可…

面试题:说说Java线程的状态及转换

文章目录 为何要了解Java线程状态Java线程状态转换图Java线程有哪些状态?关于wait()放在while循环的疑问BLOCKED 和 WAITING 状态的区别和联系 为何要了解Java线程状态 线程是 JVM 执行任务的最小单元,理解线程的状态转换是理解后续多线程问题的基础。 …

网站为什么需要https证书以及如何申请

随着互联网的快速发展,网站的安全性问题越来越受到人们的关注。因此,越来越多的网站开始使用https证书,以保护用户的数据安全和隐私。那么,网站为什么需要https证书呢? 首先,https证书可以提供加密保护&…

ROS IMU 数据发布---rviz_imu_plugin的安装

ROS中发布IMU传感器消息 - 润新知 按照上述链接的方法执行 catkin_make install -DCMAKE_INSTALL_PREFIX/opt/ros/noetic 后报错 这个错误是因为在安装过程中,CMake无法将文件复制到目标路径。这可能是由于权限不足导致的。可以尝试使用以下命令更改目标文件夹的…