【JAVA】数据脱敏技术(对称加密算法、非对称加密算法、哈希算法、消息认证码(MAC)算法、密钥交换算法)使用方法

news2024/9/20 3:06:54

在这里插入图片描述

文章目录

      • 数据脱敏的定义和目的
      • 数据脱敏的技术分类
        • 对称加密算法
        • 非对称加密算法
        • 哈希算法
        • 消息认证码(MAC)算法
        • 密钥交换算法
      • 数据脱敏的技术方案实现
        • 字符替换
        • 哈希算法(例如:SHA-3 算法)
        • 消息认证码(MAC)算法(CMAC)
        • 消息认证码(MAC)算法(HMAC)
        • 对称/非对称加密实现方式(例如:AES加密算法)
        • 数据分段
        • 数据伪装

更多相关内容可查看

数据脱敏的定义和目的

数据脱敏(Data Masking)是指对数据进行处理,替换或掩盖其真实内容,以防止敏感信息被未经授权的用户访问。脱敏后的数据仍然能够保留原数据的格式和某些特征,但无法反映真实的敏感信息。其主要目的是保护隐私、遵守法律法规、以及降低数据泄露的风险。


数据脱敏的技术分类

对称加密算法

对称加密算法使用相同的密钥进行加密和解密。常见的对称加密算法包括:

  • AES (Advanced Encryption Standard): AES是一种广泛使用的对称加密算法,支持128位、192位和256位密钥长度。
  • DES (Data Encryption Standard) : DES曾经是标准的对称加密算法,但由于密钥长度较短(56位),现在已经不再推荐用于安全敏感的应用。
  • 3DES (Triple DES): 是DES的增强版本,通过三次加密增加安全性。
  • Blowfish: 一种可变密钥长度的对称加密算法,速度快且安全性高。
  • Twofish: Blowfish的后续版本,支持256位密钥

非对称加密算法

非对称加密算法使用一对密钥(公钥和私钥),加密和解密使用不同的密钥。常见的非对称加密算法包括:

  • RSA (Rivest–Shamir–Adleman): 一种广泛使用的非对称加密算法,主要用于安全数据传输。
  • DSA (Digital Signature Algorithm): 用于数字签名的算法,通常与SHA算法一起使用。
  • ECC (Elliptic Curve Cryptography): 使用椭圆曲线数学的非对称加密算法,提供相对较高的安全性和效率。

哈希算法

哈希算法将任意长度的数据映射到固定长度的散列值,不可逆转。常见的哈希算法包括:

  • MD5 (Message Digest Algorithm 5) : 生成128位散列值,但由于安全性问题现在已经不再推荐使用。
  • SHA-1 (Secure Hash Algorithm 1): 生成160位散列值,但也因为安全问题逐渐被淘汰。
  • SHA-2 (Secure Hash Algorithm 2): 包括SHA-224、SHA-256、SHA-384和SHA-512,提供更强的安全性。
  • SHA-3 (Secure Hash Algorithm 3): 最新的哈希标准,提供比SHA-2更高的安全性。

消息认证码(MAC)算法

MAC算法用于确保消息的完整性和验证消息的来源。常见的MAC算法包括:

  • HMAC (Hash-based Message Authentication Code): 结合了哈希算法(如SHA-256)与密钥,确保消息完整性和认证。
  • CMAC (Cipher-based Message Authentication Code): 结合了对称加密算法(如AES)与密钥,用于生成认证码。

密钥交换算法

这些算法用于安全地交换密钥。常见的密钥交换算法包括:

  • Diffie-Hellman: 用于在不安全的通道上安全地交换密钥。
  • Elliptic Curve Diffie-Hellman (ECDH): 基于椭圆曲线的Diffie-Hellman算法,提供更高的安全性和效率。

在Java中,这些加密算法通常通过 javax.crypto、java.security 和 java.security.cert包提供


数据脱敏的技术方案实现

字符替换

将敏感数据的字符替换为特定的符号或字符。例如,将身份证号码的中间部分替换为“*”:

public class DataMasking {

    public static String maskIdNumber(String idNumber) {
        if (idNumber == null || idNumber.length() < 6) {
            return idNumber;
        }
        return idNumber.substring(0, 3) + "****" + idNumber.substring(7);
    }

    public static void main(String[] args) {
        String idNumber = "123456789012345";
        System.out.println(maskIdNumber(idNumber)); // 输出: 123****345
    }
}
哈希算法(例如:SHA-3 算法)
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HexFormat;

public class SHA3Example {

    // 使用SHA-3进行哈希
    public static String hashWithSHA3(String data) throws NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("SHA3-256"); // 可以用 "SHA3-224", "SHA3-256", "SHA3-384", "SHA3-512"
        byte[] hashBytes = digest.digest(data.getBytes());
        return HexFormat.of().formatHex(hashBytes); // 将字节数组转换为十六进制字符串
    }

    public static void main(String[] args) {
        try {
            String originalData = "Hello, SHA-3!";
            String hashedData = hashWithSHA3(originalData);
            System.out.println("Original Data: " + originalData);
            System.out.println("SHA-3 Hash: " + hashedData);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

消息认证码(MAC)算法(CMAC)
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Mac;
import javax.crypto.spec.IvParameterSpec;
import java.util.Arrays;
import java.util.Base64;

public class CMACExample {

    private static final String AES = "AES";
    private static final String CMAC = "AESCMAC";

    // 生成CMAC
    public static String generateCMAC(String data, String key) throws Exception {
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("UTF-8"), AES);
        Mac mac = Mac.getInstance(CMAC);
        mac.init(keySpec);

        byte[] dataBytes = data.getBytes("UTF-8");
        byte[] cmacBytes = mac.doFinal(dataBytes);

        return Base64.getEncoder().encodeToString(cmacBytes);
    }

    // 验证CMAC
    public static boolean verifyCMAC(String data, String key, String cmac) throws Exception {
        String generatedCmac = generateCMAC(data, key);
        return generatedCmac.equals(cmac);
    }

    public static void main(String[] args) {
        try {
            String data = "Hello, CMAC!";
            String key = "mysecretkey1234"; // 16-byte key for AES

            // 生成CMAC
            String cmac = generateCMAC(data, key);
            System.out.println("Generated CMAC: " + cmac);

            // 验证CMAC
            boolean isValid = verifyCMAC(data, key, cmac);
            System.out.println("Is the CMAC valid? " + isValid);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

消息认证码(MAC)算法(HMAC)
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class HMACExample {

    private static final String HMAC_ALGORITHM = "HmacSHA256";

    // 生成HMAC
    public static String generateHMAC(String data, String secret) throws Exception {
        SecretKeySpec keySpec = new SecretKeySpec(secret.getBytes("UTF-8"), HMAC_ALGORITHM);
        Mac mac = Mac.getInstance(HMAC_ALGORITHM);
        mac.init(keySpec);
        byte[] rawHmac = mac.doFinal(data.getBytes("UTF-8"));
        return Base64.getEncoder().encodeToString(rawHmac);
    }

    // 验证HMAC
    public static boolean verifyHMAC(String data, String secret, String hmac) throws Exception {
        String generatedHmac = generateHMAC(data, secret);
        return generatedHmac.equals(hmac);
    }

    public static void main(String[] args) {
        try {
            String data = "Hello, HMAC!";
            String secret = "mysecretkey";

            // 生成HMAC
            String hmac = generateHMAC(data, secret);
            System.out.println("Generated HMAC: " + hmac);

            // 验证HMAC
            boolean isValid = verifyHMAC(data, secret, hmac);
            System.out.println("Is the HMAC valid? " + isValid);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

对称/非对称加密实现方式(例如:AES加密算法)
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class DataEncryption {

    // AES算法
    private static final String ALGORITHM = "AES";

    // 加密方法
    public static String encrypt(String data, SecretKey key) throws Exception {
        // 创建Cipher对象,指定加密算法
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        // 初始化Cipher对象为加密模式
        cipher.init(Cipher.ENCRYPT_MODE, key);
        // 执行加密操作,返回加密后的字节数组
        byte[] encryptedBytes = cipher.doFinal(data.getBytes());
        // 将加密后的字节数组转换为Base64编码的字符串
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    // 解密方法
    public static String decrypt(String encryptedData, SecretKey key) throws Exception {
        // 创建Cipher对象,指定加密算法
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        // 初始化Cipher对象为解密模式
        cipher.init(Cipher.DECRYPT_MODE, key);
        // 将Base64编码的字符串解码为字节数组
        byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);
        // 执行解密操作,返回解密后的字节数组
        byte[] decryptedBytes = cipher.doFinal(decodedBytes);
        // 将解密后的字节数组转换为字符串
        return new String(decryptedBytes);
    }

    // 生成密钥的方法
    public static SecretKey generateKey() throws Exception {
        // 创建KeyGenerator对象,指定加密算法
        KeyGenerator keyGen = KeyGenerator.getInstance(ALGORITHM);
        // 初始化KeyGenerator对象,指定密钥长度(128位)
        keyGen.init(128);
        // 生成密钥
        return keyGen.generateKey();
    }

    public static void main(String[] args) throws Exception {
        // 生成一个密钥
        SecretKey key = generateKey();
        // 原始数据
        String originalData = "SensitiveData";
        // 加密数据
        String encryptedData = encrypt(originalData, key);
        // 解密数据
        String decryptedData = decrypt(encryptedData, key);

        // 打印结果
        System.out.println("Original Data: " + originalData);
        System.out.println("Encrypted Data: " + encryptedData);
        System.out.println("Decrypted Data: " + decryptedData);
    }
}

数据分段

将敏感数据分段存储,每个分段单独处理。例如,将一个长字符串分成几段,每段单独存储和加密。

数据伪装

生成与真实数据结构相似但内容虚假的数据,用于开发和测试。例如,将真实的用户姓名替换为虚假的名字:

public class DataPseudonymization {

    public static String pseudonymizeName(String name) {
        // 简单示例,生成虚假的名字
        return "User" + (int)(Math.random() * 1000);
    }

    public static void main(String[] args) {
        String realName = "John Doe";
        String pseudonymizedName = pseudonymizeName(realName);
        System.out.println("Original Name: " + realName);
        System.out.println("Pseudonymized Name: " + pseudonymizedName);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2147702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vmware16安装教程】

&#x1f4d6;Vmware16安装教程 ✅1.下载✅2.安装 ✅1.下载 官网地址&#xff1a;https://www.vmware.com/ 百度云盘&#xff1a;Vmware16下载 123云盘&#xff1a;Vmware16下载 ✅2.安装 1.双击安装包VMware-workstation-full-16.1.0-LinuxProbe.Com.exe&#xff0c;点击…

对 JavaScript 原型的理解

笔者看了一些有关 JavaScript 原型的文章有感而发&#xff0c;就将所感所悟画了下来如果有理解错误和不足的地方&#xff0c;欢迎各位大佬指出&#xff0c;笔者感激不尽

Activiti7《第二式:破剑式》——工作流中的以柔克刚

冲冲冲&#xff01;开干 这篇文章将分为九个篇章&#xff0c;带你逐步掌握工作流的核心知识。这篇文章将带你深入探讨工作流中的 “破剑式”&#xff0c;揭示如何通过 柔与刚 的结合来破解工作流的复杂性。本篇包含了 Activiti7 环境的进一步优化和表结构的深入分析&#xff0…

【ARM】中断的处理

ARM的异常向量表 如果发生异常后并没有exception level切换&#xff0c;并且发生异常之 前使用的栈指针是SP_EL0&#xff0c;那么使用第一组异常向量表。如果发生异常后并没有exception level切换&#xff0c;并且发生异常之 前使用的栈指针是SP_EL1/2/3&#xff0c;那么使用第…

字节推音乐生成神器 Seed-Music 支持多样化输入和精确控制

Seed-Music&#xff0c;字节跳动的最新音乐创作神器&#xff0c;能通过文字、音频等多种方式轻松生成音乐&#xff0c;仿佛拥有魔法般的魔力。它巧妙地融合了自回归语言模型与扩散模型&#xff0c;不仅确保了音乐作品的高品质&#xff0c;还赋予了用户对音乐细节的精准掌控能力…

基于Python flask的淘宝商品数据分析可视化系统,包括大屏和主题分析,还有回归预测

背景介绍 随着电子商务的迅猛发展&#xff0c;平台上积累了大量的用户行为和商品交易数据。这些数据蕴含着极大的商业价值&#xff0c;可以为市场趋势预测、商品优化以及用户行为分析提供重要的参考。淘宝作为全球最大的在线购物平台之一&#xff0c;拥有海量的商品和用户数据…

OJ在线评测系统 思考主流OJ的实现方案 常用概念 自己的思考

OJ判题系统常用概念 OJ系统 在线判题系统 AC all accpeted 测试样例全部通过 题目介绍 题目输入 题目输出 题目输出用例 题目输入用例 不能让用户随便引入包 随便遍历 暴力破解 需要使用正确的算法 提交后不会立刻出结果 而是异步处理 提交后会生成一个提交记录 有运…

好用的ai写作有哪些?5个软件帮助你快速进行ai写作

好用的ai写作有哪些&#xff1f;5个软件帮助你快速进行ai写作 AI写作工具正变得越来越流行&#xff0c;能够帮助用户更快速、高效地完成各种写作任务&#xff0c;包括生成文章、写小说、改进语法等。以下是5个非常好用的AI写作软件&#xff0c;它们可以帮助你快速进行AI写作&a…

秋招八股总结

transformer 损失函数 交叉熵的原理 公式 xi是true_label&#xff0c;yi是神经网络预测为正确的概率 对比学习loss 对比学习损失函数 InfoNEC Loss&#xff08;bge中也用的这个&#xff09; SimCSE的主要思想&#xff1a;同一句话通过不同的drop out作为正例&#xff0…

腾讯百度阿里华为常见算法面试题TOP100(6):回溯、二分查找、二叉树

之前总结过字节跳动TOP50算法面试题&#xff1a; 字节跳动常见算法面试题top50整理_沉迷单车的追风少年-CSDN博客_字节算法面试题 回溯 46.全排列 class Solution { private:vector<vector<int> > ans;void dfs(vector<int>& nums, vector<int>&a…

西南民族大学若尔盖国家野外台站王志强研究员团队在树皮生态化学计量学研究中取得新进展!

本文首发于“生态学者”微信公众号&#xff01; 近日&#xff0c;西南民族大学四川若尔盖高寒湿地生态系统国家野外科学观测研究站王志强研究员团队在植物科学顶级期刊New Phytologist和环境科学与生态学TOP期刊Science of the Total Environment分别以“Global patterns and …

【Java】网络编程-地址管理-IP协议后序-NAT机制-以太网MAC机制

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a; c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 &#x1f434…

AI大模型之旅-大模型为的微调参数详解

output model.generate( inputs.input_ids, max_lengthmax_length, do_sampledo_sample, temperaturetemperature, top_ptop_p, top_ktop_k ) 大模型文本常用参数为以上几个&#xff0c;下面我们详细解析下&#xff1a; 初解&#xff1a; max_length 定义&#xff1a;生成的…

MacOS安装homebrew,jEnv,多版本JDK

1 安装homebrew homebrew官网 根据官网提示&#xff0c;运行安装命令 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"安装后&#xff0c;bash会提示执行两条命令 (echo; echo eval "$(/opt/homebrew/b…

简明linux系统编程--共享内存消息队列信号量

目录 1.父子进程共享内存 1.1基本说明 1.2主要步骤 1.3shmget函数介绍​编辑 1.4函数返回值 1.5shmat函数介绍 1.6shmdt函数介绍 1.7结合代码理解 2.非亲缘关系的进程的共享内存通信 2.1和上面的区别 2.2如何通信 2.3具体代码 3.父子进程消息队列 4.非亲缘关系的进…

极狐GitLab 重要安全版本:17.3.3, 17.2.7, 17.1.8, 17.0.8, 16.11.10

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

BitLocker硬盘加密的详细教程分享

硬盘加密是将数据转换为一种只有授权用户才能读取的形式。通过使用加密算法&#xff0c;硬盘上的数据在存储时被加密&#xff0c;只有输入正确的密钥或密码才能解密和访问这些数据。 硬盘加密的重要性 数据是现代社会的重要资产&#xff0c;保护这些数据免受非法访问和窃取至关…

Mobile net V系列详解 理论+实战(2)

Mobilenet 系列 实践部分一、数据集介绍二、模型整体框架三、模型代码详解四、总结 实践部分 本章针对实践通过使用pytorch一个实例对这部分内容进行吸收分析。本章节采用的源代码在这里感兴趣的读者可以自行下载操作。 一、数据集介绍 可以看到数据集本身被存放在了三个文件…

处理RabbitMQ连接和认证问题

在使用RabbitMQ进行消息队列管理时&#xff0c;我们可能会遇到各种连接和认证问题。本文将介绍如何诊断和解决这些问题&#xff0c;并通过使用RabbitMQ的管理端进行登录验证来确保配置正确。 1. 问题概述 在最近的一次部署中&#xff0c;我们遇到了两个主要问题&#xff1a; …

一对一,表的设计

表很大&#xff0c;比如用户 用户登录只需要部分数据&#xff0c;所以把用户表拆成两个表 用户登录表 用户信息表 一对一设计有两种方案&#xff1a; 加外键&#xff0c;唯一 主键共享