首页 > 编程语言 >Java 数据脱敏?别慌,掩护队已经上线!

Java 数据脱敏?别慌,掩护队已经上线!

时间:2024-11-30 20:00:14浏览次数:7  
标签:return String 别慌 static Java 数据 public 脱敏

引言

大家好!今天我们要聊一聊数据脱敏。这个词听起来像特工电影里的高科技武器,其实它就是给敏感数据穿上“伪装衣”,防止“坏人”偷窥。无论是银行账号、身份证号码、邮箱地址,这些信息都需要时刻保持低调。如何低调?没错——数据脱敏,Java 已准备好为你服务!

1. 什么是数据脱敏?你是不是以为要给数据打马赛克?

数据脱敏,简单来说就是“数据打码”,让重要数据在数据库、日志、前端展示时只露出“有限真容”。就像电影里的特工,只看部分特征,整个人你是认不出来的。

2. 为什么数据脱敏很重要?因为隐私就是“金库”

数据脱敏的重要性不言而喻。想象一下,你的银行账号、电话号码被人公开了,会是什么感觉?这不仅是隐私问题,也是信息安全问题。所以无论是保护个人隐私还是遵守法律法规,数据脱敏都是必要的手段。

3. Java 数据脱敏的常用方式

Java 提供了多种数据脱敏方式,今天咱们来聊几种经典实用的“伪装术”。

3.1 字符遮盖法(Masking)

这是最常见的脱敏手段之一,简单粗暴。通过用“*”或者其他字符代替敏感数据的中间部分,数据仍然保留部分可识别信息,但不会透露完整内容。

public class DataMaskingUtil {

    // 手机号脱敏
    public static String maskPhoneNumber(String phoneNumber) {
        if (phoneNumber == null || phoneNumber.length() != 11) {
            return phoneNumber; // 无法脱敏时,直接返回原号码
        }
        return phoneNumber.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
    }

    // 身份证号脱敏
    public static String maskIdCardNumber(String idCard) {
        if (idCard == null || idCard.length() != 18) {
            return idCard; // 不符合18位身份证长度
        }
        return idCard.replaceAll("(\\d{6})\\d{8}(\\d{4})", "$1********$2");
    }

    // 邮箱地址脱敏
    public static String maskEmailAddress(String email) {
        if (email == null || !email.contains("@")) {
            return email;
        }
        return email.replaceAll("(\\w{2})\\w*(\\w{1}@.*)", "$1****$2");
    }

    // 银行卡号脱敏
    public static String maskBankCardNumber(String cardNumber) {
        if (cardNumber == null || cardNumber.length() < 16) {
            return cardNumber;
        }
        return cardNumber.replaceAll("(\\d{4})\\d{8,12}(\\d{4})", "$1****$2");
    }
    
    // 示例:脱敏信用卡号只保留最后4位
    public static String maskCreditCardNumber(String cardNumber) {
        if (cardNumber == null || cardNumber.length() < 16) {
            return cardNumber;
        }
        return cardNumber.replaceAll("\\d{12}(\\d{4})", "**** **** **** $1");
    }
}
3.2 数据替换法(Substitution)

有时候,我们不仅要遮盖数据,还要替换数据。通过生成假数据来掩饰真实信息。例如,将某个身份证号替换为随机生成的虚拟号码:

import java.util.Random;

public class DataSubstitutionUtil {

    // 随机生成伪身份证号
    public static String substituteIdCardNumber() {
        String prefix = "110101";  // 代表北京市
        String suffix = generateRandomDigits(8) + "****";  // 随机生成8位数,再加马赛克
        return prefix + suffix;
    }

    // 随机生成指定位数的数字
    private static String generateRandomDigits(int length) {
        Random random = new Random();
        StringBuilder digits = new StringBuilder();
        for (int i = 0; i < length; i++) {
            digits.append(random.nextInt(10));
        }
        return digits.toString();
    }

    // 测试身份证替换
    public static void main(String[] args) {
        System.out.println("替换身份证号: " + substituteIdCardNumber());
    }
}
3.3 数据加密法(Encryption)

加密脱敏是高级手段,通过加密算法将数据转换为无法识别的密文,只有拥有密钥的用户才能解密。这里我们使用 Java 提供的 Cipher 类来进行对称加密。

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;

public class DataEncryptionUtil {

    private static final String ALGORITHM = "AES";  // 使用 AES 对称加密算法

    // 生成随机密钥
    public static SecretKey generateKey() throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
        keyGenerator.init(128);
        return keyGenerator.generateKey();
    }

    // 加密数据
    public static String encrypt(String data, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedBytes = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    // 解密数据
    public static String decrypt(String encryptedData, SecretKey secretKey) throws Exception {
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);
        byte[] decryptedBytes = cipher.doFinal(decodedBytes);
        return new String(decryptedBytes);
    }

    // 示例测试加密解密
    public static void main(String[] args) throws Exception {
        SecretKey secretKey = generateKey();
        String originalData = "SensitiveData123";
        String encryptedData = encrypt(originalData, secretKey);
        String decryptedData = decrypt(encryptedData, secretKey);

        System.out.println("原始数据: " + originalData);
        System.out.println("加密后的数据: " + encryptedData);
        System.out.println("解密后的数据: " + decryptedData);
    }
}
3.4 哈希法(Hashing)

哈希是一种不可逆的脱敏方式,通常用于密码或验证场景。数据经过哈希处理后,无法直接还原为原始数据,只能用于验证匹配。我们可以用 Java 中的 MessageDigest 来实现哈希。

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class DataHashingUtil {

    // 对数据进行 SHA-256 哈希
    public static String hashData(String data) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] hashBytes = digest.digest(data.getBytes());
            StringBuilder hexString = new StringBuilder();
            for (byte b : hashBytes) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("哈希算法异常", e);
        }
    }

    // 示例测试
    public static void main(String[] args) {
        String originalData = "SensitiveData123";
        String hashedData = hashData(originalData);

        System.out.println("原始数据: " + originalData);
        System.out.println("哈希后的数据: " + hashedData);
    }
}
4. 数据脱敏的实际应用场景

在实际项目中,数据脱敏是一个综合性的策略,通常用在:

  1. 日志系统:日志里可能会记录很多敏感信息,直接展示会导致泄露风险。

    public static void logWithMasking(String userData) {
        System.out.println("用户信息: " + maskPhoneNumber(userData));
    }
    
  2. 数据库查询展示:很多时候我们从数据库中查询出的数据需要做脱敏处理再展示给前端。

    public static List<String> getMaskedUserData(List<String> rawData) {
        return rawData.stream()
                      .map(DataMaskingUtil::maskPhoneNumber) // 对手机号脱敏
                      .collect(Collectors.toList());
    }
    
  3. API 响应:后台提供的 API 中也要对返回给前端的数据进行脱敏处理,避免敏感信息泄露。

    public ResponseEntity<UserInfoDto> getUserInfo(Long userId) {
        UserInfoDto userInfo = userService.findById(userId);
        userInfo.setPhoneNumber(DataMaskingUtil.maskPhoneNumber(userInfo.getPhoneNumber()));
        return ResponseEntity.ok(userInfo);
    }
    
5. 总结

Java 数据脱敏不仅仅是防止信息泄露的工具,它还是保护用户隐私的一道防线。在实际开发中,选择合适的脱敏方式(遮盖、替换、加密或哈希),能大大提升系统的安全性。

标签:return,String,别慌,static,Java,数据,public,脱敏
From: https://blog.csdn.net/qq_21484461/article/details/142188224

相关文章

  • 从高校就业信息管理系统到Python和Java类系统开题报告:结构化研究的提纲优化
    个人名片......
  • 大学生HTML期末大作业——HTML+CSS+JavaScript培训机构(画室)
    HTML+CSS+JS【培训机构】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • JavaWeb:Servlet (学习笔记)【1】
    目录一,Servlet介绍1,简介2,Servlet技术特点3,Servlet在应用程序中的位置4,Servlet在程序中到底处于一个什么地位?二,servlet运行过程:三,servlet路径配置四,Servlet的生命周期1,伪单例模式2,生命周期的步骤3,讲解Servlet是一个伪单例模式五,什么是生命周期啊?就是说什么时候有......
  • 前端:JavaScript (学习笔记)【2】
    目录一,数组的使用1,数组的创建  [ ]2,数组的元素和长度3,数组的遍历方式4,数组的常用方法二,JavaScript中的对象1,常用对象(1)String和java中的String很类似,的常用方法(2) Number的常用属性和方法(包装类)   [1]属性   [2 ]数学方法(3)Math对象(4)Date......
  • Java Web : HTTP协议
    目录一,HTTP协议的概述二,HTTP协议的特点1,基于请求和响应模型2,简单快捷3,长链接:4,单向性:5,无状态6,灵活二,HTTP协议的交互流程1,请求部分【1】请求行(1个)(1)请求方式​编辑(2)请求地址【固定的】(3)协议(4)版本号【固定的】【2】请求头(n个)【3】请求主体2,响应部分【1】响应行......
  • Java--面向对象三大特征多态
    目录概念多态调用成员的特点多态的优势和弊端概念多种形态,完成某个行为,当不同的对象去完成时会产生出不同的状态,简而言之,同类型的对象,表现出不同状态及对象的多种形态其好处是使用父类作为参数,可以接收所有子类对象,体现了多态的扩展性与便利。代码如下(示例):父类类型对象名称......
  • jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
    拓展阅读JVMFULLGC生产问题I-多线程通用实现JVMFULLGC生产问题II-如何定位内存泄露?线程通用实现JVMFULLGC生产问题III-多线程执行队列的封装实现,进一步抽象jvisualvmjava性能分析工具jvm-44-jvm内存性能分析工具EclipseMemoryAnalyzerTool(MAT)/内存......
  • JavaScript 中的原型和原型链
    JavaScript中的原型和原型链也是一个相对较难理解透彻的知识点,下面结合详细例子来进行说明:一、原型的概念在JavaScript中,每个函数都有一个prototype属性,这个属性指向一个对象,这个对象就是所谓的“原型对象”。当通过构造函数创建一个新的实例对象时,该实例对象会自动......
  • Java基于SpringBoot的教师教学培训管理系统的设计与实现
    收藏关注不迷路!!......
  • Java基于springboot的一个在线环保意识教育平台的设计与实现
    收藏关注不迷路!!......