干货:敏感数据实现加解密脱敏?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、资讯、面试等多个领域。无论是前沿科技的探索,还是实用技巧的总结,我们都致力于为大家呈现有价值的内容。期待与你共同进步,开启技术之旅。

相关推荐
vipbic5 分钟前
Strapi 5 怎么用才够爽?这款插件带你实现“建站自由”
后端·node.js
苏三的开发日记43 分钟前
linux搭建hadoop服务
后端
sir7611 小时前
Redisson分布式锁实现原理
后端
大学生资源网1 小时前
基于springboot的万亩助农网站的设计与实现源代码(源码+文档)
java·spring boot·后端·mysql·毕业设计·源码
苏三的开发日记1 小时前
linux端进行kafka集群服务的搭建
后端
苏三的开发日记2 小时前
windows系统搭建kafka环境
后端
爬山算法2 小时前
Netty(19)Netty的性能优化手段有哪些?
java·后端
Tony Bai2 小时前
Cloudflare 2025 年度报告发布——Go 语言再次“屠榜”API 领域,AI 流量激增!
开发语言·人工智能·后端·golang
想用offer打牌2 小时前
虚拟内存与寻址方式解析(面试版)
java·后端·面试·系统架构
無量2 小时前
AQS抽象队列同步器原理与应用
后端