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

server/2024/9/23 3:29:34/

在这里插入图片描述

文章目录

      • 数据脱敏的定义和目的
      • 数据脱敏的技术分类
      • 数据脱敏的技术方案实现
        • 字符替换
        • 哈希算法(例如: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包提供


数据脱敏的技术方案实现

字符替换

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

java">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 算法)
java">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)
java">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)
java">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_211">对称/非对称加密实现方式(例如:AES加密算法
java">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);}
}
数据分段

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

数据伪装

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

java">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.ppmy.cn/server/118277.html

相关文章

uniapp 发布苹果IOS详细流程,包括苹果开发者公司账号申请、IOS证书、.p12证书文件等

记录一下uniapp发布苹果IOS的流程。 一、苹果开发者公司账号申请 1、邓白氏编码申请&#xff08;先申请公司邓白氏编码&#xff0c;这一步需要1-2周&#xff0c;没有这个编码苹果开发者没法申请&#xff0c;已有编码的跳过此步骤&#xff09;&#xff1a; 1&#xff09;联系苹…

‌内网穿透技术‌总结

内网穿透是一种网络技术&#xff0c;通过它可以使外部网络用户访问内部网络中的设备和服务。一般情况下&#xff0c;内网是无法直接访问的&#xff0c;因为它位于一个封闭的局域网中&#xff0c;无法从外部访问。而通过内网穿透&#xff0c;可以将内部网络中的设备和服务暴露在…

算法两道题

算法一 Write a function: int solution(vector<int>&A); that, given an array A of length N, returns as an integer the minimum number of moves needed to transform a zero-filled array into A. Examples: 1. Given A [2, 1, 3], the function should …

redis:全局ID生成器实现

问题&#xff1a;订单id不能设置为自增长的原因 id的规律性太明显&#xff0c; 受订单的数据量限制:若数据量过大&#xff0c;需要多张表存储&#xff0c;若自增会导致id重复 全局ID生成器&#xff1a;在分布式系统中用来生成全局唯一ID的工具 ID的组成&#xff1a; 符号位…

微信小程序中的实时通讯:TCP/UDP 协议实现详解

文章目录 前言一、实时通讯的基础知识二、微信小程序中 TCP/UDP 的支持2.1 TCP 实现2.2 UDP 实现 三、实现即时通讯的基本架构四、实际开发中的注意事项4.1 网络环境问题4.2 数据格式与协议设计4.3 消息重发机制 五、实时通讯中的性能优化5.1 减少不必要的通信5.2 数据压缩5.3 …

mysql的分区表

1.SQL表创建 下面以时间范围进行创建&#xff08;每月一个分区&#xff0c;表中创建了四个月的分区&#xff09; 创建&#xff1a;CREATE TABLE test_table ( id INT NOT NULL AUTO_INCREMENT, content VARCHAR(255), create_time DATETIME NOT NULL,PRIMARY KEY (id, cre…

Flask中的钩子函数

在Flask中&#xff0c;钩子函数&#xff08;Hook Functions&#xff09;或称为回调函数&#xff08;Callback Functions&#xff09;是特殊的函数&#xff0c;它们在Flask的请求处理流程中的特定点被自动调用。这些钩子函数允许你在请求被处理之前或之后、视图函数执行之前或之…

9.11-kubeadm方式安装k8s

一、安装环境 编号主机名称ip地址1k8s-master192.168.2.662k8s-node01192.168.2.773k8s-node02192.168.2.88 二、前期准备 1.设置免密登录 [rootk8s-master ~]# ssh-keygen [rootk8s-master ~]# ssh-copy-id root192.168.2.77 [rootk8s-master ~]# ssh-copy-id root192.168…