我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

前后端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 class="lazy" data-srcs = CryptoJS.enc.Utf8.parse(data);
   var encrypted = CryptoJS.AES.encrypt(class="lazy" data-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交互是怎么保证数据安全性了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

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

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

java前后端数据怎么交互

在Java的前后端开发中,有多种方式可以实现前后端数据的交互。以下是几种常见的方式:1. RESTful API:使用基于HTTP协议的RESTful API进行数据交互。前端通过发送HTTP请求(如GET、POST、PUT、DELETE等
2023-08-20

ajax怎么实现前后端数据交互

Ajax是一种用于实现前后端数据交互的技术,它可以通过异步请求在不重新加载整个页面的情况下更新部分页面内容。下面是使用Ajax实现前后端数据交互的一般步骤:1. 创建XMLHttpRequest对象:使用JavaScript创建一个XMLH
2023-09-15

thymeleaf中前后端数据交互怎么实现

这篇“thymeleaf中前后端数据交互怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“thymeleaf中前后端数据
2023-07-02

Vue前端怎么实现与后端进行数据交互

这篇文章主要介绍了Vue前端怎么实现与后端进行数据交互的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue前端怎么实现与后端进行数据交互文章都会有所收获,下面我们一起来看看吧。Vue前端与后端数据交互安装npm
2023-06-29

axios和SpringBoot前端怎么调用后端接口进行数据交互

这篇文章主要介绍“axios和SpringBoot前端怎么调用后端接口进行数据交互”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“axios和SpringBoot前端怎么调用后端接口进行数据交互”文章
2023-07-05

Teradata中怎么保证数据的安全性和完整性

在Teradata中,可以采取以下措施来确保数据的安全性和完整性:访问控制:通过对用户和角色进行权限管理,限制用户对数据库和表的访问权限,防止未经授权的访问和操作。数据加密:对数据进行加密存储和传输,确保数据在传输和存储过程中不被窃取或篡改
Teradata中怎么保证数据的安全性和完整性
2024-04-09

Teradata中怎么保证数据的安全性和完整性

Teradata提供全面的数据安全性和完整性保障措施:数据加密:静态数据加密和传输层安全加密。访问控制:基于角色的访问控制和细粒度访问控制。数据完整性保护:校验和、哈希、主键、外键、触发器和约束。审计和监控:审计追踪、监控和警报。安全管理:集中安全管理和定期安全审核。其他安全措施:数据掩码、数据匿名化、防火墙和入侵检测系统,确保数据免受未经授权的访问、篡改和丢失。
Teradata中怎么保证数据的安全性和完整性
2024-04-09

怎么保证Redis序列化数据的完整性与安全性

要保证Redis序列化数据的完整性与安全性,可以采取以下措施:使用合适的序列化机制:选择合适的序列化机制可以确保数据的完整性和安全性。常见的序列化机制包括JSON、MessagePack、Protobuf等,可以根据具体需求选择最适合的序列
怎么保证Redis序列化数据的完整性与安全性
2024-04-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录