iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >前后端API交互是怎么保证数据安全性
  • 536
分享到

前后端API交互是怎么保证数据安全性

2023-06-04 08:06:24 536人浏览 泡泡鱼
摘要

这期内容当中小编将会给大家带来有关前后端api交互是怎么保证数据安全性,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最

这期内容当中小编将会给大家带来有关前后端api交互是怎么保证数据安全性,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

前言

前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最后进行联调整合。无论是开发原生的APP还是WEBapp还是PC端的软件,只要是前后端分离的模式,就避免不了调用后端提供的接口来进行业务交互。

网页或者app,只要抓下包就可以清楚的知道这个请求获取到的数据,这样的接口对爬虫工程师来说是一种福音,要抓你的数据简直轻而易举。

数据的安全性非常重要,特别是用户相关的信息,稍有不慎就会被不法分子盗用,所以我们对这块要非常重视,容不得马虎。

如何保证API调用时数据的安全性?

  1. 通信使用https

  2. 请求签名,防止参数被篡改

  3. 身份确认机制,每次请求都要验证是否合法

  4. APP中使用ssl pinning防止抓包操作

  5. 对所有请求和响应都进行加解密操作

  6. 等等方案…….

对所有请求和响应都进行加解密操作

方案有很多种,当你做的越多,也就意味着安全性更高,今天我跟大家来介绍一下对所有请求和响应都进行加解密操作的方案,即使能抓包,即使能调用我的接口,但是我返回的数据是加密的,只要加密算法够安全,你得到了我的加密内容也对我没什么影响。

像这种工作最好做成统一处理的,你不能让每个开发都去关注这件事情,如果让每个开发去关注这件事情就很麻烦了,返回数据时还得手动调用下加密的方法,接收数据后还得调用下解密的方法。

为此,我基于Spring Boot封装了一个Starter, 内置了AES加密算法。GitHub地址如下:

Https://github.com/yinjihuan/spring-boot-starter-encrypt

先来看看怎么使用,可以下载源码,然后引入即可,然后在启动类上增加@EnableEncrypt注解开启加解密操作:

@EnableEncrypt
@SpringBootApplication
public class App {
   public static void main(String[] args) {
       SpringApplication.run(App.class, args);
   }
}

增加加密的key配置:

spring.encrypt.key=abcdef0123456789
spring.encrypt.debug=false
  • spring.encrypt.key:加密key,必须是16位

  • spring.encrypt.debug:是否开启调试模式,默认为false,如果为true则不启用加解密操作

为了考虑通用性,不会对所有请求都执行加解密,基于注解来做控制

响应数据需要加密的话,就在Controller的方法上加@Encrypt注解即可。

@Encrypt
@GetMapping("/list")
public Response queryNews(String city) {
   return Response.ok(city);
}

当我们访问/list接口时,返回的数据就是加密之后base64编码的格式。

还有一种操作就是前段提交的数据,分为2种情况,一种是get请求,这种暂时没处理,后面再考虑,目前只处理的post请求,基于JSON格式提交的方式,也就是说后台需要用@RequestBody接收数据才行, 需要解密的操作我们加上@Decrypt注解即可。

@Decrypt
@PostMapping("/save")
public Response savePageLog(@RequestBody PageLogParam logParam, HttpServletRequest request) {
   pageLogService.save(logParam);
   return Response.ok();
}

加了@Decrypt注解后,前端提交的数据需要按照AES加密算法,进行加密,然后提交到后端,后端这边会自动解密,然后再映射到参数对象中。

上面讲解的都是后端的代码,前端使用的话我们以js来讲解,当然你也能用别的语言来做,如果是原生的安卓app也是用java代码来处理。

前端需要做的就2件事情:

  1. 统一处理数据的响应,在渲染到页面之前进行解密操作

  2. 当有POST请求的数据发出时,统一加密

js加密文件请参考我GitHub中encrypt中的aes.js,crypto-js.js,pad-zeropadding.js

我们以axiOS来作为请求数据的框架,用axios的拦截器来统一处理加密解密操作

首先还是要封装一个js加解密的类,需要注意的是加密的key需要和后台的对上,不然无法相互解密,代码如下:

var key  = CryptoJS.enc.Latin1.parse('abcdef0123456789');
var iv   = CryptoJS.enc.Latin1.parse('abcdef0123456789');
// 加密
function EncryptData(data) {
   var srcs = CryptoJS.enc.Utf8.parse(data);
   var encrypted = CryptoJS.AES.encrypt(srcs, key, {
       mode : CryptoJS.mode.ECB,
       padding : CryptoJS.pad.Pkcs7
   });
   return encrypted.toString();
}
// 解密
function DecryptData(data) {
   var stime = new Date().getTime();
   var decrypt = CryptoJS.AES.decrypt(data, key, {
       mode : CryptoJS.mode.ECB,
       padding : CryptoJS.pad.Pkcs7
   });
   var result = JSON.parse(CryptoJS.enc.Utf8.stringify(decrypt).toString());
   var etime = new Date().getTime();
   console.log("DecryptData Time:" + (etime - stime));
   return result;
}

axios拦截器中统一处理代码:

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
   // 对所有POST请加密,必须是json数据提交,不支持表单
   if (config.method == "post") {
       config.data = EncryptData(JSON.stringify(config.data));
   }
   return config;
 }, function (error) {
   return Promise.reject(error);
});
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
   // 后端返回字符串表示需要解密操作
   if(typeof(response.data) == "string"){
       response.data = DecryptData(response.data);
   }
   return response;
 }, function (error) {
   return Promise.reject(error);
});

到此为止,我们就为整个前后端交互的通信做了一个加密的操作,只要加密的key不泄露,别人得到你的数据也没用,问题是如何保证key不泄露呢?

服务端的安全性较高,可以存储在数据库中或者配置文件中,毕竟在我们自己的服务器上,最危险的其实就时前端了,app还好,可以打包,但是要防止反编译等等问题。

如果是webapp则可以依赖于js加密来实现,下面我给大家介绍一种动态获取加密key的方式,只不过实现起来比较复杂,我们不上代码,只讲思路:

加密算法有对称加密和非对称加密,AES是对称加密,RSA是非对称加密。之所以用AES加密数据是因为效率高,RSA运行速度慢,可以用于签名操作。

我们可以用这2种算法互补,来保证安全性,用RSA来加密传输AES的秘钥,用AES来加密数据,两者相互结合,优势互补。

其实大家理解了HTTPS的原理的话对于下面的内容应该是一看就懂的,HTTPS比HTTP慢的原因都是因为需要让客户端与服务器端安全地协商出一个对称加密算法。剩下的就是通信时双方使用这个对称加密算法进行加密解密。

  1. 客户端启动,发送请求到服务端,服务端用RSA算法生成一对公钥和私钥,我们简称为pubkey1,prikey1,将公钥pubkey1返回给客户端。

  2. 客户端拿到服务端返回的公钥pubkey1后,自己用RSA算法生成一对公钥和私钥,我们简称为pubkey2,prikey2,并将公钥pubkey2通过公钥pubkey1加密,加密之后传输给服务端。

  3. 此时服务端收到客户端传输的密文,用私钥prikey1进行解密,因为数据是用公钥pubkey1加密的,通过解密就可以得到客户端生成的公钥pubkey2

  4. 然后自己在生成对称加密,也就是我们的AES,其实也就是相对于我们配置中的那个16的长度的加密key,生成了这个key之后我们就用公钥pubkey2进行加密,返回给客户端,因为只有客户端有pubkey2对应的私钥prikey2,只有客户端才能解密,客户端得到数据之后,用prikey2进行解密操作,得到AES的加密key,最后就用加密key进行数据传输的加密,至此整个流程结束。

spring-boot-starter-encrypt原理

最后我们来简单的介绍下spring-boot-starter-encrypt的原理吧,也让大家能够理解为什么Spring Boot这么方便,只需要简单的配置一下就可以实现很多功能。

启动类上的@EnableEncrypt注解是用来开启功能的,通过@Import导入自动配置类

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({EncryptAutoConfiguration.class})
public @interface EnableEncrypt {
}

EncryptAutoConfiguration中配置请求和响应的处理类,用的是Spring中的RequestBodyAdvice和ResponseBodyAdvice,在Spring中对请求进行统计处理比较方便。如果还要更底层去封装那就要从servlet那块去处理了。

@Configuration
@Component
@EnableAutoConfiguration
@EnableConfigurationProperties(EncryptProperties.class)
public class EncryptAutoConfiguration {
   
   @Bean
   public EncryptResponseBodyAdvice encryptResponseBodyAdvice() {
       return new EncryptResponseBodyAdvice();
   }
   
   @Bean
   public EncryptRequestBodyAdvice encryptRequestBodyAdvice() {
       return new EncryptRequestBodyAdvice();
   }
}

通过RequestBodyAdvice和ResponseBodyAdvice就可以对请求响应做处理了,大概的原理就是这么多了。

上述就是小编为大家分享的前后端API交互是怎么保证数据安全性了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 前后端API交互是怎么保证数据安全性

本文链接: https://www.lsjlt.com/news/237030.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 前后端API交互是怎么保证数据安全性
    这期内容当中小编将会给大家带来有关前后端API交互是怎么保证数据安全性,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最...
    99+
    2023-06-04
  • java前后端数据怎么交互
    在Java的前后端开发中,有多种方式可以实现前后端数据的交互。以下是几种常见的方式:1. RESTful API:使用基于HTTP协...
    99+
    2023-08-20
    java
  • ajax怎么实现前后端数据交互
    Ajax是一种用于实现前后端数据交互的技术,它可以通过异步请求在不重新加载整个页面的情况下更新部分页面内容。下面是使用Ajax实现前...
    99+
    2023-09-15
    ajax
  • thymeleaf中前后端数据交互怎么实现
    这篇“thymeleaf中前后端数据交互怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“thymeleaf中前后端数据...
    99+
    2023-07-02
  • SpringBoot前后端json数据交互的全过程记录
    目录一、参考文献二、勇敢尝试三、最终选择交互方式总结一、参考文献 原生Ajax与JQuery Ajax SpringMVC接受JSON参数详解及常见错误总结 提交方式为 POST 时...
    99+
    2024-04-02
  • Vue前端怎么实现与后端进行数据交互
    这篇文章主要介绍了Vue前端怎么实现与后端进行数据交互的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue前端怎么实现与后端进行数据交互文章都会有所收获,下面我们一起来看看吧。Vue前端与后端数据交互安装npm...
    99+
    2023-06-29
  • axios和SpringBoot前端怎么调用后端接口进行数据交互
    这篇文章主要介绍“axios和SpringBoot前端怎么调用后端接口进行数据交互”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“axios和SpringBoot前端怎么调用后端接口进行数据交互”文章...
    99+
    2023-07-05
  • AngularJS与后端php的数据怎么交互
    这篇文章主要讲解了“AngularJS与后端php的数据怎么交互”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“AngularJS与后端php的数据怎么交互”...
    99+
    2024-04-02
  • python+html实现前后端数据交互界面显示的全过程
    目录前言1.python开发工具2.项目创建总结前言 最近刚刚开始学习如何将python后台与html前端结合起来,现在写一篇blog记录一下,我采用的是前后端不分离形式。 话不多说...
    99+
    2024-04-02
  • NoSQL数据库怎么与前端进行交互
    NoSQL数据库与前端可以通过以下几种方式进行交互: RESTful API:通过RESTful API调用数据库的接口,前端可...
    99+
    2024-05-07
    NoSQL
  • Teradata中怎么保证数据的安全性和完整性
    在Teradata中,可以采取以下措施来确保数据的安全性和完整性: 访问控制:通过对用户和角色进行权限管理,限制用户对数据库和表...
    99+
    2024-04-09
    Teradata
  • 使用springboot怎么实现前后台数据交互
    这篇文章将为大家详细讲解有关使用springboot怎么实现前后台数据交互,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.在路径中传递数据,比如对某个数据的id:123前台发送:格式大致如...
    99+
    2023-05-31
    springboot
  • 国内云服务器怎么保证数据安全性
    国内云服务器保证数据安全性的方法:1、搭建完善的数据隔离防护系统,提高国内云服务器数据安全性;2、定时对国内云服务器数据进行备份;3、对存储在国内云服务器上的数据进行加密;4、避免所有数据在云端处理,做一个国内云服务器副本进行分类;5、做好...
    99+
    2024-04-02
  • 怎么保证Redis序列化数据的完整性与安全性
    要保证Redis序列化数据的完整性与安全性,可以采取以下措施: 使用合适的序列化机制:选择合适的序列化机制可以确保数据的完整性和...
    99+
    2024-04-29
    Redis
  • 云服务器怎么保证数据安全
    云服务器是一种虚拟化的资源管理平台,它通过互联网连接到用户的计算设备上,以便可以为用户提供稳定、高效和安全的计算服务。因此,在处理云服务器上的数据时,必须确保数据的安全。以下是一些方法来确保云服务器的数据安全: 加密数据:云服务器通常采...
    99+
    2023-10-26
    服务器 数据
  • 租用服务器时怎样才能保证数据安全性
    租用服务器时保证数据安全性的方法:1、给服务器使用网站验证码,降低网站出现恶意注册的风险;2、给服务器安装SSL证书实现数据加密传输,从而有效提高速度安全性;3、需要定期对服务器网站程序进行安全扫描,排查异常问题并及时处理;4、需要及时更新...
    99+
    2024-04-02
  • NoSQL数据库的安全性怎么保障
    NoSQL数据库的安全性主要通过以下几种方式来保障: 访问控制:通过设置用户权限和角色来限制不同用户对数据库的访问权限,确保只有...
    99+
    2024-05-07
    NoSQL
  • Cassandra中是怎么保证数据一致性的
    Cassandra 使用了一种称为 “分布式一致性” 的模型来保证数据一致性。在 Cassandra 中,数据被分布在多个节点上,每...
    99+
    2024-04-02
  • 怎么保证服务器里面数据的安全呢
    保证服务器里面数据安全的方法:1、需要做好服务器数据库维护措施,避免数据丢失;2、需要定期更新服务器软件程序,避免黑客利用漏洞窃取数据;3、需要做好服务器数据备份,防止数据丢失无法恢复;4、需要给服务器建立一个完善的灾难恢复机制,保障数据安...
    99+
    2024-04-02
  • Beam中怎么保证数据处理的完全一致性
    在 Beam 中,可以通过以下方式确保数据处理的完全一致性: 使用事务性处理(Transactional Processing)...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作