当前位置: 首页 > news >正文

在Java中实现数据脱敏:敏感信息的安全存储与传输

在Java中实现数据脱敏:敏感信息的安全存储与传输

大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨在Java中如何实现数据脱敏,确保敏感信息的安全存储与传输。随着隐私保护和信息安全要求的不断提升,数据脱敏技术变得越来越重要,特别是在处理诸如身份证号、手机号、银行卡号等敏感信息时。数据脱敏的目的是通过对数据进行部分或完全遮盖,确保在传输或存储过程中即使被截获,也无法还原完整的敏感数据。

一、数据脱敏的概念与常见策略

数据脱敏(Data Masking)是一种对敏感信息进行隐藏或模糊处理的技术,它通常会在不影响业务操作的前提下将部分信息隐藏。常见的脱敏策略包括:

  1. 部分脱敏:将数据的部分内容替换为固定字符,如将手机号的中间几位替换成“****”。
  2. 完全脱敏:对数据进行完全替换,例如加密或使用伪造数据替代原始数据。
  3. 动态脱敏:在运行时根据用户权限动态决定是否显示或部分显示敏感信息。

二、常见敏感信息脱敏的实现

下面我们通过几种常见的敏感信息如手机号、身份证号、银行卡号等来示范如何在Java中实现脱敏。

1. 手机号脱敏

手机号一般以11位数字组成,脱敏时通常保留前三位和后四位,中间部分替换为“****”。

代码实现:

package cn.juwatech.masking;public class SensitiveDataMasking {// 手机号脱敏public static String maskPhoneNumber(String phoneNumber) {if (phoneNumber == null || phoneNumber.length() != 11) {throw new IllegalArgumentException("手机号格式不正确");}return phoneNumber.substring(0, 3) + "****" + phoneNumber.substring(7);}public static void main(String[] args) {String phoneNumber = "13812345678";System.out.println("脱敏后的手机号: " + maskPhoneNumber(phoneNumber));}
}

在这个代码中,maskPhoneNumber方法通过截取手机号的前3位和后4位,将中间部分替换为****

2. 身份证号脱敏

身份证号一般是18位,通常脱敏时会保留前六位和后四位,中间的部分使用星号遮盖。

代码实现:

package cn.juwatech.masking;public class SensitiveDataMasking {// 身份证号脱敏public static String maskIdCard(String idCard) {if (idCard == null || idCard.length() != 18) {throw new IllegalArgumentException("身份证号格式不正确");}return idCard.substring(0, 6) + "********" + idCard.substring(14);}public static void main(String[] args) {String idCard = "110101199001011234";System.out.println("脱敏后的身份证号: " + maskIdCard(idCard));}
}

这里的maskIdCard方法将身份证号的中间8位替换为星号,避免泄露完整的个人信息。

3. 银行卡号脱敏

银行卡号通常为16至19位,在进行脱敏时,一般保留前四位和后四位,中间的部分用星号遮盖。

代码实现:

package cn.juwatech.masking;public class SensitiveDataMasking {// 银行卡号脱敏public static String maskBankCard(String bankCard) {if (bankCard == null || bankCard.length() < 16 || bankCard.length() > 19) {throw new IllegalArgumentException("银行卡号格式不正确");}return bankCard.substring(0, 4) + "********" + bankCard.substring(bankCard.length() - 4);}public static void main(String[] args) {String bankCard = "6222021234567891234";System.out.println("脱敏后的银行卡号: " + maskBankCard(bankCard));}
}

通过maskBankCard方法,我们可以将银行卡号的中间部分替换为8个星号,有效防止数据泄露。

三、加密存储敏感信息

在某些场景中,数据脱敏只能用于展示,无法在存储和传输中完全保护数据。因此,针对敏感信息的加密存储也是必须的。通常我们会使用对称加密算法(如AES)或者非对称加密算法(如RSA)来加密数据,并在需要时进行解密。

1. 使用AES加密存储敏感信息

AES是一种常用的对称加密算法,能够快速对数据进行加密和解密操作。

AES加密与解密代码示例:

package cn.juwatech.encryption;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;public class AESEncryptionUtil {private static final String AES_ALGORITHM = "AES";// 生成AES密钥public static SecretKey generateAESKey() throws Exception {KeyGenerator keyGen = KeyGenerator.getInstance(AES_ALGORITHM);keyGen.init(128); // 使用128位加密return keyGen.generateKey();}// 加密public static String encrypt(String data, SecretKey secretKey) throws Exception {Cipher cipher = Cipher.getInstance(AES_ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] encryptedBytes = cipher.doFinal(data.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);}// 解密public static String decrypt(String encryptedData, SecretKey secretKey) throws Exception {Cipher cipher = Cipher.getInstance(AES_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] decodedBytes = Base64.getDecoder().decode(encryptedData);return new String(cipher.doFinal(decodedBytes));}public static void main(String[] args) throws Exception {String sensitiveData = "SensitiveInfo123";// 生成密钥SecretKey secretKey = generateAESKey();// 加密数据String encryptedData = encrypt(sensitiveData, secretKey);System.out.println("加密后的数据: " + encryptedData);// 解密数据String decryptedData = decrypt(encryptedData, secretKey);System.out.println("解密后的数据: " + decryptedData);}
}

在这个示例中,我们首先使用KeyGenerator生成AES密钥,然后通过Cipher类进行加密和解密操作。加密后的数据可以安全地存储在数据库中,当需要读取时再进行解密操作。

四、敏感信息的安全传输

在数据传输过程中,确保敏感信息的安全非常重要。为了防止数据在传输过程中被截获或篡改,我们通常使用以下几种方法:

  1. HTTPS:通过使用TLS(传输层安全协议)加密通信,确保数据传输的机密性和完整性。
  2. 数据签名:对传输的数据进行数字签名,以确保数据的来源和完整性。即使数据被篡改,签名验证也会失败。
  3. Token机制:通过使用JWT(JSON Web Token)或其他形式的令牌机制来保护敏感数据的传输,仅允许授权的用户访问数据。

以下是通过Java代码演示如何使用数字签名和验证数据:

数字签名与验证示例:

package cn.juwatech.signature;import java.security.*;public class DigitalSignatureUtil {// 生成密钥对public static KeyPair generateKeyPair() throws Exception {KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");keyPairGen.initialize(2048);return keyPairGen.generateKeyPair();}// 生成数字签名public static byte[] signData(String data, PrivateKey privateKey) throws Exception {Signature signature = Signature.getInstance("SHA256withRSA");signature.initSign(privateKey);signature.update(data.getBytes());return signature.sign();}// 验证数字签名public static boolean verifySignature(String data, byte[] signatureBytes, PublicKey publicKey) throws Exception {Signature signature = Signature.getInstance("SHA256withRSA");signature.initVerify(publicKey);signature.update(data.getBytes());return signature.verify(signatureBytes);}public static void main(String[] args) throws Exception {String data = "SensitiveTransactionData";// 生成密钥对KeyPair keyPair = generateKeyPair();// 生成签名byte[] signature = signData(data, keyPair.getPrivate());System.out.println("数字签名生成成功");// 验证签名boolean isVerified = verifySignature(data, signature, keyPair.getPublic());System.out.println("签名验证结果: " + isVerified);}
}

总结

在Java中实现数据脱敏和加密存储是保障敏感信息安全的关键步骤。在实际项目中,可以根据业务需求选择合适的脱敏方式和加密算法,并结合安全传输协议,确保数据在存储和传输过程中的安全性。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

相关文章:

  • Java--ArrayList(数据结构顺序表)
  • spring揭秘24-springmvc02-5个重要组件
  • 使用Python和OpenCV生成灰阶图像
  • mybatisplus code generator columnNaming 不起作用
  • 打靶记录18——narak
  • 基于冲突动态监测算法的健身房预约管理系统
  • k8s 部署ETCD ,并且使用.net core 连接获取配置
  • linux-CMake
  • MySQL进阶:深入理解数据约束与优化查询
  • Linux增加一个回收站功能(实用功能)
  • 算法复杂度之时间复杂度
  • PMA TB40-1 限温器Temperature limiter TB 40-1 手测
  • SpringBoot整合JPA实现CRUD详解
  • 【珠海一号卫星】
  • 鼎阳加油-IOC关键技术问题的解决记
  • $translatePartialLoader加载失败及解决方式
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Invalidate和postInvalidate的区别
  • JavaScript 基本功--面试宝典
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Mysql5.6主从复制
  • Promise面试题,控制异步流程
  • Rancher-k8s加速安装文档
  • Shell编程
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 仿天猫超市收藏抛物线动画工具库
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 探索 JS 中的模块化
  • 小李飞刀:SQL题目刷起来!
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • #pragam once 和 #ifndef 预编译头
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (二)测试工具
  • (转载)利用webkit抓取动态网页和链接
  • **CI中自动类加载的用法总结
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET开发者必备的11款免费工具
  • /usr/bin/env: node: No such file or directory
  • @Autowired和@Resource装配
  • [023-2].第2节:SpringBoot中接收参数相关注解
  • [2019红帽杯]Snake
  • [acm算法学习] 后缀数组SA
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [Angular 基础] - 表单:响应式表单
  • [BT]小迪安全2023学习笔记(第29天:Web攻防-SQL注入)
  • [BZOJ3757] 苹果树
  • [C#学习笔记]LINQ
  • [CSS]一文掌握
  • [CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理