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

相关推荐
lovebugs5 分钟前
🚀 Kubernetes核心命令详解:Java开发者必备指南
java·后端·kubernetes
灰色头像10 分钟前
Nginx 内置变量详解:从原理到实战案例
后端
程序员小假19 分钟前
我们来说一说解决线程安全的方案
后端
李九四25 分钟前
章节16:实现注释功能
后端·架构
_風箏26 分钟前
SpringBoot【集成Thumbnailator】Google开源图片工具缩放+区域裁剪+水印+旋转+保持比例等(保姆级教程含源代码)
spring boot·后端·google
_風箏27 分钟前
SpringBoot【ElasticSearch集成 02】Java HTTP Rest client for ElasticSearch Jest 客户端集成
java·后端·elasticsearch
xiaok28 分钟前
docker拉取镜像太慢,配置国内的镜像加速器
后端
林太白35 分钟前
动态角色权限和动态权限到底API是怎么做的你懂了吗
前端·后端·node.js
野犬寒鸦41 分钟前
力扣hot100:字母异位词分组和最长连续序列(49,128)
java·数据结构·后端·算法·哈希算法
NineData1 小时前
NineData 最新发布 SQL Server 双向实时同步功能
数据库·后端·架构