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

在这里插入图片描述

文章目录

      • 数据脱敏的定义和目的
      • 数据脱敏的技术分类
        • 对称加密算法
        • 非对称加密算法
        • 哈希算法
        • 消息认证码(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";// 生成CMACpublic 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);}// 验证CMACpublic 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// 生成CMACString cmac = generateCMAC(data, key);System.out.println("Generated CMAC: " + cmac);// 验证CMACboolean 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";// 生成HMACpublic 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);}// 验证HMACpublic 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";// 生成HMACString hmac = generateHMAC(data, secret);System.out.println("Generated HMAC: " + hmac);// 验证HMACboolean 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.mzph.cn/bicheng/54267.shtml

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

相关文章

代理导致的git错误

问题&#xff1a; 今天在clone时出现如下错误&#xff1a; fatal: unable to access https://github.com/NirDiamant/RAG_Techniques.git/: Failed to connect to 127.0.0.1 port 10089 after 2065 ms: Couldnt connect to server真是让人感到奇怪&#xff01;就在前天&#…

影刀RPE学习——自动化

下载网址&#xff1a;影刀RPA - 影刀官网 (yingdao.com) 傻瓜式安装进入界面&#xff1a; 官方教程&#xff1a;影刀RPA零基础入门教程&#xff08;2024最新版&#xff09;&#xff1a;01 引入课-影刀初相识_哔哩哔哩_bilibili

Unity Hub自动安装指定版本Unity的Android开发环境

Unity开发Android环境要求SDK、DNK、JDK、Gradle版本都要对才能发布APK&#xff0c;自己去配置很容易出错。Unity Hub可以自动安装指定版本Unity的Android开发环境。 1.安装国内用的UnityHub&#xff08;我这里用的3.3.2-c6&#xff09; 2.找到对应的Unity版本 3.点击【从Unit…

sqlgun靶场训练

1.看到php&#xff1f;id &#xff0c;然后刚好有个框&#xff0c;直接测试sql注入 2.发现输入1 union select 1,2,3#的时候在2处有回显 3.查看表名 -1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()# 4.查看列名…

【自动驾驶】决策规划算法 | 数学基础(三)直角坐标与自然坐标转换Ⅱ

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

Karpathy认为“LLM”这个名字不准确 马斯克非常赞同

LLM 应该改名吗&#xff1f;你怎么看。在 AI 领域&#xff0c;几乎每个人都在谈论大型语言模型&#xff0c;其英文全称为 Large Language Models&#xff0c;简写为 LLM。因为 LLM 中有“Language”一词&#xff0c;因此&#xff0c;大家默认这种技术和语言密切相关。然而&…

纯小白安装pytorch(快速上手)

1.首先进入你的虚拟环境(不进入也没关系) 在anaconda prompt中打开&#xff0c;输入activate 虚拟环境2.查看自己的conda源 conda config --show channels3.清空自己的conda源 conda config --remove-key channels4.添加源 conda config --add channels https://mirrors.tu…

动态规划:07.路径问题_珠宝的最大价值_C++

题目链接&#xff1a;LCR 166. 珠宝的最高价值 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/li-wu-de-zui-da-jie-zhi-lcof/description/ 一、题目解析 题目&#xff1a; 解析&#xff1a; 有过做前几道题的经验&#xff0c;我们会发现这道题其实就…

SpringBoot2:web开发常用功能实现及原理解析-上传与下载

文章目录 一、上传文件1、前端上传文件给Java接口2、Java接口上传文件给Java接口 二、下载文件1、前端调用Java接口下载文件2、Java接口下载网络文件到本地3、前端调用Java接口下载网络文件 一、上传文件 1、前端上传文件给Java接口 Controller接口 此接口支持上传单个文件和…

如何准备教师资格证科目三“学科知识与教学能力”的考试与面试?(理科导向:数学/物理)

如何准备教师资格证科目三“学科知识与教学能力”的考试与面试&#xff1f;&#xff08;理科导向&#xff1a;数学/物理&#xff09; ​ 目录 收起 1 前言 1.1 自身经历 1.2 教师资格证的作用 2 知识点题型分数的分布与学习建议 2.1 科目三的知识点分数分布&#xff1a; …

求和(2)

题目描述 输入两个正整数 l,r&#xff0c;编程计算 l(l1)(l2)...(r−1)r 的结果并输出。 输入格式 一行两个整数 l 和 r 输出格式 一个整数&#xff0c;根据题意计算后的结果 样例数据 样例输入#1 1 5样例输出#1 15样例输入#2 8 10样例输出#2 27数据范围 对于100%的…

【Ubuntu】虚拟机安装USB摄像头ROS驱动 usb_cam(最新方法)

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

Nest.js

Nestjs中文文档链接 TypeORM 中文文档 小满视频 1. 安装Nest.js 安装脚手架 npm i -g nestjs/cli创建nestjs工程 nest new工程目录 app.module.ts 根模块用于处理其他类的引用与共享。app.controller.ts 常见功能是用来处理http请求&#xff08;处理请求的路径&#xff09…

如何升级用 Helm 安装的极狐GitLab Runner?

本分分享如何对 Helm 安装的 Runner 进行升级。整个过程分为三步&#xff1a;1、确定 Runner 最新版本或者想要升级的版本是否存在&#xff1b;2、用 Helm upgrade 命令进行升级&#xff1b;3、升级确认。 极狐GitLab 为 GitLab 的中国发行版&#xff0c;中文版本对中国用户更…

react18基础教程系列-- 框架基础理论知识mvc/jsx/createRoot

react的设计模式 React 是 mvc 体系&#xff0c;vue 是 mvvm 体系 mvc: model(数据)-view(视图)-controller(控制器) 我们需要按照专业的语法去构建 app 页面&#xff0c;react 使用的是 jsx 语法构建数据层&#xff0c;需要动态处理的的数据都要数据层支持控制层: 当我们需要…

1730. 购买贺年卡

代码 #include<bits/stdc.h> using namespace std; struct c {int a,b; }t[1005]; int cmp(c a,c b) {return a.a>b.a; } int main() {int n,m,sum0;cin>>n>>m;for(int i1;i<m;i){cin>>t[i].a>>t[i].b;}sort(t1,t1m,cmp);for(int im;i&g…

如何在Linux下升级R版本和RStudio

一、升级R版本 在Linux上&#xff0c;R的安装通常通过包管理器完成。不同的Linux发行版&#xff08;如Ubuntu、Debian、Fedora等&#xff09;可能略有不同。下面以Ubuntu为例&#xff0c;介绍如何升级R版本。如果你使用其他发行版&#xff0c;步骤可能类似。 二.更新步骤 2.…

【可视化大屏系列】数据列表自动滚动效果

要实现列表的自动滚动效果&#xff0c;这里提供两种解决方案&#xff1a; 1.vue插件 官方文档&#xff1a;链接: vue-seamless-scroll &#xff08;1&#xff09;安装依赖 npm install vue-seamless-scroll --save&#xff08;2&#xff09;全局注册&#xff08;main.js中&a…

【机器学习】--- 自监督学习

1. 引言 机器学习近年来的发展迅猛&#xff0c;许多领域都在不断产生新的突破。在监督学习和无监督学习之外&#xff0c;自监督学习&#xff08;Self-Supervised Learning, SSL&#xff09;作为一种新兴的学习范式&#xff0c;逐渐成为机器学习研究的热门话题之一。自监督学习…

【linux-Day3】linux的基本指令<中>

【linux-Day3】linux的基本指令<中> linux下的基本指令&#x1f4e2;man&#xff1a;访问linux手册页&#x1f4e2;echo&#xff1a;把字符串写入指定文件中&#x1f4e2;cat&#xff1a;查看目标文件的内容&#x1f4e2;cp&#xff1a;复制文件或目录&#x1f4e2;mv&am…