您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

API接口脱敏:如何安全地处理敏感数据?

时间:2023-10-07 15:20:53  来源:  作者:Springboot实战案例锦集

环境:SpringBoot2.6.12

API接口脱敏是一种保护敏感数据的重要方法。它涉及到在数据传输和存储过程中,将敏感数据替换为无意义或伪装的数据,以防止未经授权的访问和泄露。下面是一些关于如何安全地处理敏感数据的方法:

  1. 数据加密:使用加密算法对敏感数据进行加密,以确保即使数据在传输过程中被截获,也无法被解密。常见的加密算法包括对称加密算法(如AES)和非对称加密算法(如RSA)。
  2. 数据脱敏:使用数据脱敏技术,将敏感数据替换为无意义或伪装的数据。例如,将真实的手机号码替换为随机生成的虚假号码,或将真实的姓名替换为随机生成的虚假姓名。
  3. 访问控制:对API接口进行访问控制,只允许经过身份验证和授权的用户访问。使用身份验证令牌(如JWT)或OAuth等协议对用户进行身份验证和授权。
  4. 日志记录:对API接口的访问和使用情况进行详细的日志记录,以便在发生安全事件时能够迅速发现和应对。
  5. 数据传输安全:使用HTTPS协议进行数据传输,以确保数据传输过程中的安全性。
  6. 数据存储安全:将敏感数据存储在加密的数据库中,并使用访问控制列表(ACL)等技术对数据库进行访问控制。

项目中开发的API接口,可能有些接口返回的字段信息不能以明文的形式传输,这时候我们该如何进行处理呢?以下给出3中方式:

数据库层面处理

在SQL查询的时候进行处理,但这种效率不高,一般不会这样处理。如下:

SELECT
  CONCAT(LEFT( idNo, 6), '********', RIGHT (idNo, 4)) as idNo
FROM
  users where id = 7;

查询结果:

API接口脱敏:如何安全地处理敏感数据?以掩码的方式处理部分数据

数据加密处理

该种方式就是将你需要处理的字段完全通过对称加密或者HASH算法进行处理。在写入或者查询数据的时候对敏感数据进行加密/解密处理。示例如下:

import JAVA.sql.*;  
  
public class JdbcSensitiveDataProcess {  
  public static void main(String[] args) {  
    try {  
      // 连接数据库  
      Connection conn = DataSourceUtils.getConnection() ;
      // 创建Statement对象  
      Statement stmt = conn.createStatement();  
      // 执行查询语句  
      ResultSet rs = stmt.executeQuery("SELECT id, name, encrypted_data FROM t_xxx");  
      // 遍历结果集  
      while (rs.next()) {  
        int id = rs.getInt("id");
        String name = rs.getString("name");
        String encryptedData = rs.getString("encrypted_data");
        // 对加密数据进行解密处理  
        String decryptedData = decryptData(encryptedData);
        // 输出解密后的数据  
        System.out.println("ID: " + id + ", Name: " + name + ", Decrypted Data: " + decryptedData);  
      }
    } catch (Exception e) {  
      e.printStackTrace();  
    } finally {
      // 关闭数据库相关资源
    }
  }  
  // 解密数据的方法,这里只是示例,实际需要根据具体的加密算法来实现  
  private static String decryptData(String encryptedData) {  
    // 解密逻辑...  
    // Cipher cipher = Cipher.getInsance(...) ;
    return decryptedData;  
  }  
}

JSON序列化时处理

API接口在生成JSON字符串的时候(序列化时)将敏感信息进行掩码处理或者加密处理,接下来将详细介绍第三种方式"JSON序列化时处理"。

JSON序列化处理脱敏

使用jackson时在对对象序列化时进行敏感字段的处理,为了简单我们通过自定义注解的方式来实现该功能。

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
// 该注解必须,不然jackson不会识别该注解
@JacksonAnnotationsInside
// 指定我们需要序列化字段的实现
@JsonSerialize(using = SensitiveSerializer.class)
public @interface Sensitive {


  /**
   * 正则表达式
   * @return
   */
  String pattern() default "" ;


  /**
   * 正则表达式的第几个分组;该分组将被替换为掩码mask
   * @return
   */
  int group() default 0 ;


  /**
   * 掩码
   * @return
   */
  String mask() default "*" ;


  public interface Pattern {
    /**身份证*/
    String ID = "(\w{5})(\w+)(\w{3})" ;
    /**电话*/
    String PHONE = "(\w){3}(\w+)(\w{2})" ;
    /**私密*/
    String KEY = "(\w+)" ;
  }
}

上面的注释类都有详细的说明,不再做过多的说明。

自定义序列化实现

public class SensitiveSerializer extends JsonSerializer<String> implements ContextualSerializer {


  private Sensitive sensitive ;


  @Override
  public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
    String val = value ;
    if (sensitive != null) {
      String pattern = sensitive.pattern() ;
      int groupIndex = sensitive.group() ;
      String mask = sensitive.mask() ;
      if (pattern.length() > 0) {
        Pattern pa = Pattern.compile(pattern) ;
        Matcher matcher = pa.matcher(value) ;
        if (matcher.matches()) {  
          String group = matcher.group(groupIndex) ;
          if (mask.length() > 0 && group.length() > 0) {
            val = val.replace(group, String.join("", Collections.nCopies(group.length(), mask))) ;
          }
        }
      }
    }
    gen.writeObject(val) ;
  }


  @Override
  public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property)
      throws JsonMAppingException {
    sensitive = property.getAnnotation(Sensitive.class) ;
    return this ;
  }


}

该类实现了ContextualSerializer通过该类的回调方法能够用来读取当前字段上的注解信息。

public class Users {


  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+10")
  private Date birthday ;
  private Integer age ;
  private String name ;
  // 在需要处理的字段上加入上面定义的注解,这里我们也可以自定义表达式
  @Sensitive(pattern = Sensitive.Pattern.ID)
  private String idNo
}

运行效果:

API接口脱敏:如何安全地处理敏感数据?idNo按照指定的规则进行了掩码处理

完毕!!!



Tags:API   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
中国三大运营商共同发布通过GSMA Open Gateway认证的一次性密码 API
3月26日,北京:中国三大领先的移动运营商&mdash;&mdash;中国移动、中国电信和中国联通今日发布商用OTP API(一次性密码API)服务,并通过了GSMA Open Gateway认证。此次发布标志着中...【详细内容】
2024-03-26  Search: API  点击:(18)  评论:(0)  加入收藏
如何免费访问和使用Gemini API?
Gemini是谷歌开发的一个新模型。有了Gemini可以为查询提供图像、音频和文本,获得几乎完美的答案。 我们在本教程中将学习Gemini API以及如何在机器上设置它。我们还将探究各...【详细内容】
2024-02-19  Search: API  点击:(59)  评论:(0)  加入收藏
构建 Web API 的两种流行选择:REST vs GraphQL
在 RESTful 和 GraphQL API 之间的选择取决于您的具体用例。RESTful API 适用于需要高可伸缩性的简单应用程序,而 GraphQL 则适用于具有不同数据需求的复杂应用程序。简介RES...【详细内容】
2024-01-09  Search: API  点击:(63)  评论:(0)  加入收藏
FastAPI:高性能Web框架的简介与应用
正文:在当今互联网时代,构建高性能的WebAPI是许多开发人员的关注重点。而FastAPI作为一个现代、快速的Web框架,为基于标准Python类型提示的API构建提供了强大的支持。FastAPI的...【详细内容】
2023-12-27  Search: API  点击:(101)  评论:(0)  加入收藏
理解 Spark 写入 API 的数据处理能力
这张图解释了 Apache Spark DataFrame 写入 API 的流程。它始于对写入数据的 API 调用,支持的格式包括 CSV、JSON 或 Parquet。流程根据选择的保存模式(追加、覆盖、忽略或报...【详细内容】
2023-12-13  Search: API  点击:(149)  评论:(0)  加入收藏
如何在Python中使用ChatGPT API处理实时数据
译者 | 李睿审校 | 重楼OpenAI公司推出的GPT如今已经成为全球最重要的人工智能工具,并精通基于其训练数据处理查询。但是,它不能回答未知话题的问题,例如: 2021年9月之后的近期...【详细内容】
2023-12-13  Search: API  点击:(227)  评论:(0)  加入收藏
伪原创API是什么?六个角度了解伪原创API
伪原创API,听起来可能对许多人来说是一个陌生的术语。然而,在当今数字化时代,尤其是在内容创作和网络营销领域,伪原创API正逐渐崭露头角。在本文中,我将向您深入介绍伪原创API是...【详细内容】
2023-12-11  Search: API  点击:(156)  评论:(0)  加入收藏
使用FastAPI部署YOLO模型的步骤
在计算机视觉领域,You Only Look Once (YOLO) 算法已经崭露头角,成为一种改变游戏规则的算法。它承诺具有卓越准确性的实时目标检测,使其成为从监视和自动驾驶车辆到图像和视频...【详细内容】
2023-12-06  Search: API  点击:(157)  评论:(0)  加入收藏
构建强大REST API的十个最佳实践
在项目开发中,我们经常会使用REST风格进行API的定义,这篇文章为大家提供10条在使用REST API时的最佳实践。希望能够为你带来灵感和帮助。1、使用具体且有意义的资源名称选择能...【详细内容】
2023-12-06  Search: API  点击:(149)  评论:(0)  加入收藏
前端请求到后端API的中间件流程解析
在前端请求到后端API的典型流程中,经过一系列中间件的处理,确保请求的顺利处理和安全性。以下是中间件的详细解析:1. 前端请求用户在前端发起请求,包括请求的URL、参数、以及其...【详细内容】
2023-12-06  Search: API  点击:(122)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条