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数据脱敏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringCloud之loadbalancer负载均衡组件实战详解

    SpringCloud之loadbalancer负载均衡组件实战详解

    LoadBalancer是Spring Cloud官方提供的负载均衡组件,可用于替代Ribbon,这篇文章主要介绍了SpringCloud之loadbalancer负载均衡组件,需要的朋友可以参考下
    2023-06-06
  • Java日常练习题,每天进步一点点(57)

    Java日常练习题,每天进步一点点(57)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-08-08
  • java Spring 5 新特性函数式Web框架详细介绍

    java Spring 5 新特性函数式Web框架详细介绍

    正如昨天Juergen博客中所提到的,Spring 5.0的第二个里程碑是引入了一个新的函数式web框架。在这篇文章中,我们将给出关于这个框架的更多信息,,需要的朋友可以参考下
    2016-12-12
  • Java如果在try里面执行return还会不会执行finally

    Java如果在try里面执行return还会不会执行finally

    这篇文章主要介绍了Java如果在try里面执行return,那么还会不会执行finally,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Docker和 Containerd 的区别解析

    Docker和 Containerd 的区别解析

    containerd 是一个来自 Docker 的高级容器运行时,并实现了 CRI 规范,它是从 Docker 项目中分离出来,之后 containerd 被捐赠给云原生计算基金会(CNCF)为容器社区提供创建新容器解决方案的基础,这篇文章主要介绍了Docker和 Containerd 的区别,需要的朋友可以参考下
    2024-03-03
  • springsecurity实现用户登录认证快速使用示例代码(前后端分离项目)

    springsecurity实现用户登录认证快速使用示例代码(前后端分离项目)

    这篇文章主要介绍了springsecurity实现用户登录认证快速使用示例代码(前后端分离项目),本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-03-03
  • Java IO创建目录和文件实例代码

    Java IO创建目录和文件实例代码

    本篇文章给大家分享了Java IO创建目录和文件的实例代码,过程很简单,大家可以测试参考下。
    2018-02-02
  • JAVA_基本LDAP操作实例

    JAVA_基本LDAP操作实例

    这篇文章介绍了JAVA_基本LDAP操作实例,有需要的朋友可以参考一下
    2013-09-09
  • 教你用IDEA配置JUnit并进行单元测试

    教你用IDEA配置JUnit并进行单元测试

    今天教各位小伙伴怎么用IDEA配置JUnit并进行单元测试,文中有非常详细的图文介绍及代码示例,对正在学习IDEA的小伙伴有很好的帮助,需要的朋友可以参考下
    2021-05-05
  • Java的动态代理模式之Cglib代理详解

    Java的动态代理模式之Cglib代理详解

    这篇文章主要介绍了Java的动态代理模式之Cglib代理详解,Cglib代理也叫作 子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能扩展, 有些书也将Cglib代理归属到动态代理,需要的朋友可以参考下
    2023-11-11

最新评论