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

news2025/2/25 5:18:41

前言

    说到安全肯定逃不开数据的加解密,数据本地存储大多用对称加解密来实现,那网络传输数据的时候是不是也用对称加解密来实现?没错,常规网络通信时,大部分网络传输过程中基本也是用对称加解密来实现的,毕竟时间宝贵。如果使用非对称加密方式,需要花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.coloradmin.cn/o/1087953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工程师必须记住的电路元件符号及英语翻译

很多电子小白第一次接触印刷电路板(PCB)时,总会头痛那些密密麻麻的元件字母符号,这些电路元件符号基本上都是采用英语缩写,下面我们来看看这些电路元件的英语符号有哪些? 电阻器(Resistor&#…

fl studio21最新汉化破解版中文解锁下载完整版本

FL Studio 21 中文版是最受欢迎的音乐更改程序。这个工具可以改变和制作任何音乐或节奏。它还具有许多新功能,例如 Direct Wave 升级、对 Fruity Reverb 的 64 位支持,以及具有 125 个轨道的扩展混音器,可改善播放列表(Playlist&a…

软考中级和高级,有什么区别?

软考是指软件技术人员职业资格考试,是由国家人力资源和社会保障部主管的全国性考试。软考分为初级、中级和高级三个等级,其中中级和高级是较为高级的考试等级。那么,软考中级和高级有什么区别呢?本文将从以下几个方面进行阐述。 …

CVE-2020-9483 apache skywalking SQL注入漏洞

漏洞概述 当使用H2 / MySQL / TiDB作为Apache SkyWalking存储时,通过GraphQL协议查询元数据时,存在SQL注入漏洞,该漏洞允许访问未指定的数据。 Apache SkyWalking 6.0.0到6.6.0、7.0.0 H2 / MySQL / TiDB存储实现不使用适当的方法来设置SQL参…

爆肝整理,Jmeter接口性能测试-跨线程调用变量实操(超详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、Jmeter中线程运…

可观测性数据收集集大成者 Vector 介绍

如果企业提供 IT 在线服务,那么可观测性能力是必不可少的。“可观测性” 这个词近来也越发火爆,不懂 “可观测性” 都不好意思出门了。但是可观测性能力的构建却着实不易,每个企业都会用到一堆技术栈来组装建设。比如数据收集,可能…

微信页面公众号页面 安全键盘收起后页面空白

微信浏览器打开H5页面和公众号页面,输入密码时调起安全键盘,键盘收起后 键盘下方页面留白 解决办法: 1、(简单)只有在调起安全键盘(输入密码)的时候会出现这种情况,将input属性改为n…

基于Springboot实现校园疫情登记防控系统项目【项目源码+论文说明】计算机毕业设计

基于Springboot实现校园疫情登记平台系统演示 摘要 2019年12月19号中国武汉发生第一例新冠病毒的到来,大家都在听从政府的号召在居家隔离,不管是在城市还是在乡镇、农村,这引起我的注目,设计一套校园疫情防控系统,疫情…

记一次fineBI的增量删除更新BUG

官方文档链接是https://help.fanruan.com/finebi/doc-view-1663.html 按照官方文档,增量删除不能使用select * ,且需要指定分区建 但实际指定分区键有时候也会报错,因为表设置的字段有时候会比数据源少,此时会报错,提…

一键部署开源AI(人工智能对话模型)(支持显卡或CPU加内存运行)--ChatGLM-6B

一、基本介绍: 基于ChatGLM-6B 的快速安装服务,支持一键安装,无需任何服务配置和代码编写即可完成。 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数…

js实现日历 完整版

<template><div id"calendar"><!-- 年份 月份 --><div class"title"><div class"label">活动日历</div><div class"total">当前活动 {{ list.length }} 场</div></div><div…

云化XR和沉浸式全息交互技术的探索与思考

// 编者按&#xff1a;计算机图形与仿真技术的发展为人类带来了众多的沉浸式技术。虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;、混合现实&#xff08;MR&#xff09;等技术通过不同程度数字信息与现实环境的融合&#xff0c;为用户带来了全新体…

clickhouse数据库简介,列式存储

clickhouse数据库简介 1、关于列存储 所说的行式存储和列式存储&#xff0c;指的是底层的存储形式&#xff0c;数据在磁盘上的真实存储&#xff0c;至于暴漏在上层的用户的使用是没有区别的&#xff0c;看到的都是一行一行的表格。 idnameuser_id1闪光10266032轨道物流10265…

【计算机毕设选题推荐】幼儿园管理系统SpringBoot+SSM+Vue

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 项目名 基于SpringBoot的幼儿园管理系统 技术栈 SpringBootSSMVueMySQLMaven 文章目录 一、幼儿园管…

记录一个@Transaction注解引发的bug

记录一个Transactional(readOnly true)注解引发的bug 一、问题代码和报错 1-1 问题代码模拟 引发这个问题的三大要素分别是&#xff1a; 事务注解任意数据库操作数据库操作后执行耗时业务&#xff08;耗时超过数据库配置的超时时间&#xff09; //1.这里是问题的核心之一…

基于springboot实现实验室管理系统项目【项目源码+论文说明】

摘要 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合…

淘宝商品销量数据接口,淘宝API接口

淘宝商品销量数据接口是淘宝开放平台提供的一种API接口&#xff0c;通过该接口&#xff0c;商家可以获取到淘宝平台上的商品销量数据。 淘宝商品销量数据接口可以用于获取特定商品的销量数据、特定店铺的销量数据、特定类目的销量数据等。商家可以根据自己的需求来调用该接口&…

python基础教程:print()函数知识点总结

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 print() 方法用于打印输出 语法&#xff1a; print(*objects, sep , end\n, filesys.stdout, flushFalse)参数 objects – 复数&#xff0c;表示可以一次输出多个对象。输出多个对象时&#xff0c;需要用 , 分隔。 sep – …

cas-server5.3自定义密码校验规则

前面几篇文章都是关于cas的,今天继续,cas有自己的一个加密配置.如果只是简单使用MD5或者SM3等加密算法进行加密的话,可以不需要再进行自定义操作,但是我们一般还会给用户密码加盐,这样的话原本的配置就不满足了,所以需要再自定义一个密码校验规则 实现PasswordEncoder接口 Pa…

数据报表的种类

根据报表使用频率不同&#xff0c;目的不同&#xff0c;使用群体不同&#xff0c;细化程度不同等情况&#xff0c;一般数据报表可以分为日常报表和临时报表&#xff0c;日常报表又分为管理报表和专题分析报表。 1. 日常报表 日常报表通常是指使用频率较高&#xff08;一般取3…