Java数据脱敏的常用方式总结

 更新时间:2024年11月29日 10:22:16   作者:繁依Fanyi  
大家好!今天我们要聊一聊数据脱敏,这个词听起来像特工电影里的高科技武器,其实它就是给敏感数据穿上“伪装衣”,防止“坏人”偷 窥,Java 提供了多种数据脱敏方式,今天咱们来聊几种经典实用的“伪装术”,感兴趣的小伙伴跟着小编一起来看看吧

引言

大家好!今天我们要聊一聊数据脱敏。这个词听起来像特工电影里的高科技武器,其实它就是给敏感数据穿上“伪装衣”,防止“坏人”偷 窥。无论是银行账号、身份证号码、邮箱地址,这些信息都需要时刻保持低调。如何低调?没错——数据脱敏,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. 数据脱敏的实际应用场景

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

  • 日志系统:日志里可能会记录很多敏感信息,直接展示会导致泄露风险。
public static void logWithMasking(String userData) {
    System.out.println("用户信息: " + maskPhoneNumber(userData));
}
  • 数据库查询展示:很多时候我们从数据库中查询出的数据需要做脱敏处理再展示给前端。
public static List<String> getMaskedUserData(List<String> rawData) {
    return rawData.stream()
                  .map(DataMaskingUtil::maskPhoneNumber) // 对手机号脱敏
                  .collect(Collectors.toList());
}
  • 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 数据脱敏不仅仅是防止信息泄露的工具,它还是保护用户隐私的一道防线。在实际开发中,选择合适的脱敏方式(遮盖、替换、加密或哈希),能大大提升系统的安全性。

到此这篇关于Java数据脱敏的常用方式总结的文章就介绍到这了,更多相关Java数据脱敏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java8中Map常用的遍历方式

    Java8中Map常用的遍历方式

    这篇文章主要给大家介绍了关于Java8中Map常用的遍历方式,map属于java中的顶级接口之一,区别于list,map是键值对的形式存在,需要的朋友可以参考下
    2023-07-07
  • java并发编程死锁定义及如何避免死锁

    java并发编程死锁定义及如何避免死锁

    这篇文章主要为大家介绍了java并发编程中死锁的详细说明及如何避免死锁的方法,有需要的朋友可以借鉴参考下希望能够有所帮助,祝大家多多进步
    2022-02-02
  • Java批量修改文件名的实例代码

    Java批量修改文件名的实例代码

    几天前在163公开课上下了一些mp4视频文件。发现课程名和文件名不对应,想到编个程序批量修改。先分析网页源代码将课程名和文件名一一对应,存储在一个文件里,然后使用Java读取该文件进而修改文件名。
    2013-04-04
  • Java中的2种集合排序方法介绍

    Java中的2种集合排序方法介绍

    这篇文章主要介绍了Java中的2种集合排序方法介绍,本文直接给出代码,相关说明请看代码中的注释,需要的朋友可以参考下
    2014-10-10
  • Spring创建bean对象三种方式代码实例

    Spring创建bean对象三种方式代码实例

    这篇文章主要介绍了Spring创建bean对象三种方式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java BigDecimal类用法详解

    Java BigDecimal类用法详解

    本文详细讲解了Java BigDecimal类的用法,文中通过示例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • java 实现线程同步的方式有哪些

    java 实现线程同步的方式有哪些

    当使用多个线程来访问同一个数据时,非常容易出现线程安全问题,所以我们用同步机制来解决这些问题,本文将详细介绍,需要的朋友可以参考下
    2012-11-11
  • Java项目打包发布到maven私仓常见的几种方式

    Java项目打包发布到maven私仓常见的几种方式

    这篇文章主要介绍了项目打包发布到maven私仓常见的几种方式,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-03-03
  • 使用 Spring Boot Admin 监控应用状态的详细过程

    使用 Spring Boot Admin 监控应用状态的详细过程

    这篇文章主要介绍了使用 Spring Boot Admin 监控应用状态,该模块采集应用的内部信息,并暴露给外部的模块,支持 HTTP 和 JMX,并可以与一些第三方监控系统(如 Prometheus)整合,需要的朋友可以参考下
    2022-09-09
  • Java IO三大模型(BIO/NIO/AIO)的使用总结

    Java IO三大模型(BIO/NIO/AIO)的使用总结

    相信很多Java开发刚接触IO模型时,都会被「BIO、NIO、AIO」「同步、异步、阻塞、非阻塞」这些概念绕晕,下面就来详细的介绍一下 IO三大模型的使用,感兴趣的可以了解一下
    2026-02-02

最新评论