干货:敏感数据实现加解密脱敏?Hutool的AES+hide一气呵成

摘要

本文使用Hutool自带的AES封装加密策略,同时结合内部工具类来实现数据脱敏。

实现原理

Hutool的加密脱敏核心原理是利用AES对称加密算法对敏感数据进行加密保护,采用随机生成的128-bit密钥增强安全性,并通过Base64编码方便数据传输存储。解密后,使用StrUtil.hide方法按规则隐藏部分数据实现脱敏展示,如隐藏人名中间部分、身份证号大部分数字等,以平衡数据安全与信息展示需求。

示例代码

1)导入依赖

xml 复制代码
<!-- hutool工具包 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.29</version>
</dependency>

2)定义规则

arduino 复制代码
package org.coffeebeans.service.aes;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.symmetric.AES;

/**
 * 对称加密脱敏/解密工具
 * 内部自动生成 128 bit 随机密钥,也可外部指定
 */
public final class SensitiveCrypto {

    private static final AES AES = new AES(RandomUtil.randomBytes(16)); // 16 byte = 128 bit

    private SensitiveCrypto() {}

    //加密
    public static String mask(String plain) {
        return AES.encryptBase64(plain);
    }

    //解密
    public static String unmask(String cipher) {
        return AES.decryptStr(cipher);
    }
}

3)使用工具

ini 复制代码
package org.coffeebeans.service.aes;

import cn.hutool.core.util.StrUtil;

public class AESUse {
    public static void main(String[] args) {
        // 原始数据
        String name = "张三";
        String idCard = "53333618541251";
        String telPhone = "13888888888";
        String mobilePhone = "5201111";
        String address = "四川省成都市高新区1号";
        String email = "1234567890@qq.com";

        // 1. 脱敏(加密)
        String maskedName = SensitiveCrypto.mask(name);
        String maskedIdCard = SensitiveCrypto.mask(idCard);
        String maskedTelPhone = SensitiveCrypto.mask(telPhone);
        String maskedMobilePhone = SensitiveCrypto.mask(mobilePhone);
        String maskedAddress = SensitiveCrypto.mask(address);
        String maskedEmail = SensitiveCrypto.mask(email);

        System.out.println("加密后:");
        System.out.println("name   = " + maskedName);
        System.out.println("idCard = " + maskedIdCard);
        System.out.println("telPhone = " + maskedTelPhone);
        System.out.println("mobilePhone = " + maskedMobilePhone);
        System.out.println("maskedAddress   = " + maskedAddress);
        System.out.println("email  = " + maskedEmail);
        /*
            加密后:
            name = 5+Znlwozz3/mhfGAC3AOFQ==
            idCard = oT5EboAJ5rCCZkQCuppDzA==
            telPhone = aY5XDQwXQtVpuQZ5I3VRCA==
            mobilePhone = z6/QQNPujE0EUGbm0v9hGA==
            maskedAddress = X/BRAw6pYY/WrQA0zNz1Vvp9exm7r9Z4AIJFigWmzbU=
            email = aHB+fFUiAAoBAcgsPcvUNvcE5m6lLzW4DmLEfONhLC4=
         */

        // 2. 解密(仅授权场景)
        String unmaskedName = SensitiveCrypto.unmask(maskedName);
        String unmaskedIdCard = SensitiveCrypto.unmask(maskedIdCard);
        String unmaskedTelPhone = SensitiveCrypto.unmask(maskedTelPhone);
        String unmaskedMobilePhone = SensitiveCrypto.unmask(maskedMobilePhone);
        String unmaskedAddress = SensitiveCrypto.unmask(maskedAddress);
        String unmaskedEmail = SensitiveCrypto.unmask(maskedEmail);

        System.out.println("\n解密后:");
        System.out.println("name   = " + unmaskedName);
        System.out.println("idCard = " + unmaskedIdCard);
        System.out.println("telPhone = " + unmaskedTelPhone);
        System.out.println("mobilePhone = " + unmaskedMobilePhone);
        System.out.println("address   = " + unmaskedAddress);
        System.out.println("email  = " + unmaskedEmail);
        /*
            解密后:
            name = 张三
            idCard = 53333618541251
            telPhone = 13888888888
            mobilePhone = 5201111
            address = 四川省成都市高新区1号
            email = 1234567890@qq.com
         */

        // 3. 解密后脱敏
        System.out.println("\n解密后脱敏:");
        System.out.println("name   = " + StrUtil.hide(unmaskedName, 1, 2));
        System.out.println("idCard = " + StrUtil.hide(unmaskedIdCard, 1, idCard.length() - 2));
        System.out.println("telPhone = " + StrUtil.hide(unmaskedTelPhone, 3, unmaskedTelPhone.length() - 4));
        System.out.println("mobilePhone = " + StrUtil.hide(unmaskedMobilePhone, 3, 7));
        System.out.println("address  = " + StrUtil.hide(unmaskedAddress, 3, 100));
        System.out.println("email  = " + StrUtil.hide(unmaskedEmail, 1, email.indexOf('@')));
        /*
            解密后脱敏:
            name = 张*
            idCard = 5***********51
            telPhone = 138****8888
            mobilePhone = 520****
            address = 四川省********
            email = 1*********@qq.com
         */
    }
}

总结

以上我们了解了如何使用Hutool自带的AES+hide来实现敏感数据加解密脱敏。

关注公众号:咖啡Beans

在这里,我们专注于软件技术的交流与成长,分享开发心得与笔记,涵盖编程、AI、资讯、面试等多个领域。无论是前沿科技的探索,还是实用技巧的总结,我们都致力于为大家呈现有价值的内容。期待与你共同进步,开启技术之旅。

相关推荐
yuanlaile6 小时前
Go语言(Golang)2026年3月整理经典面试常见问题面试题汇总,建议收藏
后端·golang·go语言面试题·golang后端开发·2026golang面试
斌糖雪梨6 小时前
spring registerBeanPostProcessors(beanFactory) 源码详解
java·后端·spring
wqww_16 小时前
springboot 使用websocket来记录移动人物坐标
spring boot·后端·websocket
一只幸运猫.6 小时前
Rust实用工具特型-Clone
开发语言·后端·rust
0xDevNull6 小时前
Java BigDecimal 完全指南:从入门到精通
java·开发语言·后端
无心水6 小时前
17、Java内存溢出(OOM)避坑指南:三个典型案例深度解析
java·开发语言·后端·python·架构·java.time·java时间处理
咚为7 小时前
深入浅出 Rust 内存顺序:从 CPU 重排到 Atomic Ordering
开发语言·后端·rust
weixin_408099677 小时前
OCR 在线识别 + API 接口实战:从网页验证到系统集成
图像处理·人工智能·后端·ocr·api·图片文字识别·文字识别
crack_comet8 小时前
Spring Boot 3.5.11 分离打包(无参数启动+Jar瘦身)完整配置文档
java·spring boot·后端·maven·intellij-idea·jar
echome8888 小时前
Go 语言并发编程:Channel 与 Goroutine 的完美结合
开发语言·后端·golang