加密解密脱敏展示 使用base64加密

//type:1表示字符串加密。2表示字符串解密。
	public String encryptionAndDecryption (String type,String field){
		if(field == null || ("").equals(field.trim())){
			return field;
		}
		if("1".equals(type)){
			BASE64Encoder encoder = new BASE64Encoder();
			String encode = encoder.encode(field.getBytes());
			return encode;
		}else if("2".equals(type)){
			BASE64Decoder decoder = new BASE64Decoder();
			try {
				String decode = new String ( decoder.decodeBuffer(field));
				return decode;
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return field;
	}
	//1表示时间加密。2表示时间解密。
	public Date encryptionAndDecryptionToDate (String type,Date field){
		if(field == null){
			return field;
		}
		GregorianCalendar calendar = new GregorianCalendar();
		calendar.setTime(field);
		if("1".equals(type)){
			calendar.add(calendar.YEAR, 68);
			Date date = calendar.getTime(); 
			return date;
		}else if("2".equals(type)){
			calendar.add(calendar.YEAR, -68);
			Date date = calendar.getTime(); 
			return date;
		}
		return field;
	}
	
	//按照要求进行字段的脱敏显示
		//type:1表示 手机号/证件号/出生日期...:开头及末尾各保留2位,中间显示为*;
		//type:2表示 邮箱:保留前3个字符和@后面的内容,如:zha**********@sinosoft.com.cn; 
		//type:3表示 姓名/别名/地址...只展示第一个字符,如张*;
		//type:4表示 性别/证件类型/民族/其他:全部显示为*;
		public String desensitizationDisplay (String menuPower,String type,String field){
			if(field == null || ("").equals(field.trim())){
				return field;
			}
			if("1".equals(type)){
				String begin = field.substring(0, 2);
				String end = field.substring(field.length()-2, field.length());
				String desensitizationLength = desensitizationLength(4,field);
				return begin + desensitizationLength + end;
			}else if ("2".equals(type)){
				String begin = field.substring(0, 3);
				String[] strs = field.split("@");
				String desensitizationLength = desensitizationLength(3,strs[0]);
				String end = strs[strs.length-1];
				return begin + desensitizationLength + "@" + end;
			}else if("3".equals(type)){
				String begin = field.substring(0, 1);
				String desensitizationLength = desensitizationLength(1,field);
				return begin + desensitizationLength;
			}else if("4".equals(type)){
				return "*";
			}
			return field;
		}
	
	//根据要保留的字符长度来填充字符串剩余的*
	public String desensitizationLength (int length,String field){
		String desensitization = "";
		for (int i=0;i<field.length()-length;i++){
			desensitization+="*";
		}
		return desensitization;
		
	}
<think>好的,用户现在问的是前端传输加密加上对敏感字段的AES二次加密。之前我们讨论了Spring Boot项目如何集成腾讯云SDK实现短信登录,并提到了敏感数据加密,比如AES。现在用户可能想进一步了解如何在前端进行加密,特别是结合传输层加密和二次加密。 首先,我需要确定用户的使用场景。可能是在注册或登录过程中,用户需要提交敏感信息如手机号、身份证号等,用户希望这些数据在传输过程中即使被截获也难以解密。他们可能担心即使使用了HTTPS,仍然希望额外加密敏感字段,以增加安全性。 用户的真实需求可能包括:确保数据在传输过程中双重加密,防止中间人攻击,以及存储时的数据安全。深层需求可能涉及合规要求,比如某些行业标准要求对特定数据进行加密处理,或者用户对数据隐私有特别高的要求。 接下来,我需要整理前端加密的常用方法。HTTPS是基础,必须的。然后在前端使用AES加密敏感字段,这样即使HTTPS被破解(虽然可能性低),数据仍然被加密。需要注意的是,AES的密钥管理是关键,如何安全地传递密钥给前端,或者使用非对称加密来传递密钥。 可能的挑战包括:前端加密的性能影响,密钥的安全存储和传输,以及后端解密处理的正确性。同时,需要考虑如何在不影响用户体验的情况下实现这些加密步骤。 然后,要分步骤介绍实现方式。首先强调必须使用HTTPS,然后生成AES密钥,可能通过后端接口动态获取,或者使用RSA加密AES密钥。前端使用CryptoJS或Web Cryptography API进行加密,后端解密并处理数据。同时,二次加密可能指的是对某些字段在存储前的再次加密,比如数据库中的手机号用AES加密存储。 还需要提到安全注意事项,比如避免硬编码密钥,使用安全的密钥交换机制,定期更换密钥,以及防止重放攻击。此外,日志中不应记录敏感数据,加密后的字段在传输和存储中的处理方式。 最后,可能需要给出代码示例,比如前端如何加密,后端如何解密,以及存储时的二次加密。确保用户能够按照步骤实施,同时理解每一步的安全考量。</think>在前后端交互中,通过**前端传输加密 + 敏感字段二次加密**的组合方案,可以有效提升数据安全性。以下是具体实现方案和技术细节: --- ### 一、整体加密流程 ```mermaid sequenceDiagram participant 前端 participant 后端 前端->>后端: HTTPS传输(TLS加密) Note over 前端: 对敏感字段(如手机号/身份证)进行AES加密 后端->>后端: 解密AES数据后,再对敏感字段二次加密存储 ``` --- ### 二、核心设计原则 1. **分层加密**: - **第一层**:HTTPS(TLS)保证传输通道安全 - **第二层**:敏感字段在前端使用AES加密 2. **密钥管理**: - AES密钥通过安全渠道获取(如登录后动态下发) - 避免硬编码密钥到前端代码 3. **防重放攻击**: - 加密数据加入时间戳/随机数 - 服务端校验数据时效性 --- ### 三、前端加密实现(以Vue+CryptoJS为例) #### 1. 安装CryptoJS ```bash npm install crypto-js ``` #### 2. AES加密工具类 ```javascript import CryptoJS from 'crypto-js' // 加密方法(CBC模式+Base64编码) function encryptData(data, key, iv) { const encrypted = CryptoJS.AES.encrypt( CryptoJS.enc.Utf8.parse(data), CryptoJS.enc.Utf8.parse(key), { iv: CryptoJS.enc.Utf8.parse(iv), mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } ) return encrypted.toString() } // 示例:加密手机号 const phone = '13800138000' const aesKey = '16/24/32字节密钥' // 从后端接口动态获取 const iv = '16字节初始化向量' const encryptedPhone = encryptData(phone, aesKey, iv) ``` --- ### 四、后端解密与二次加密(Java实现) #### 1. 接收并解密数据 ```java public String decryptAES(String encryptedData, String key, String iv) { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES"); IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); byte[] decodedBytes = Base64.getDecoder().decode(encryptedData); byte[] decryptedBytes = cipher.doFinal(decodedBytes); return new String(decryptedBytes, StandardCharsets.UTF_8); } ``` #### 2. 二次加密存储(使用独立密钥) ```java // 数据库存储加密(密钥与前端不同) public String reEncryptForStorage(String data) { String storageKey = "独立存储密钥"; // ...类似解密流程,使用不同密钥加密 return encryptedData; } ``` --- ### 五、密钥安全方案 1. **动态密钥获取**: ```javascript // 前端登录后获取临时密钥 axios.get('/api/getEncryptKey').then(res => { sessionStorage.setItem('aesKey', res.data.key) sessionStorage.setItem('aesIv', res.data.iv) }) ``` 2. **密钥生成接口**(Java): ```java @GetMapping("/getEncryptKey") public Map<String, String> generateKey() { String key = RandomStringUtils.randomAlphanumeric(32); // AES-256 String iv = RandomStringUtils.randomAlphanumeric(16); redisTemplate.opsForValue().set( "KEY:" + getCurrentUser(), key + ":" + iv, 5, TimeUnit.MINUTES ); return Map.of("key", key, "iv", iv); } ``` --- ### 六、安全增强措施 1. **防篡改校验**: - 在加密数据中加入HMAC签名 ```javascript // 前端添加HMAC const signature = CryptoJS.HmacSHA256(encryptedData, key).toString() ``` 2. **请求时效控制**: ```java // 后端校验时间戳 if (System.currentTimeMillis() - timestamp > 5000) { throw new RuntimeException("请求已过期"); } ``` 3. **敏感数据脱敏**: ```java // 日志过滤(使用@JsonIgnore) public class UserDTO { @JsonIgnore private String phone; } ``` --- ### 七、优缺点分析 | **优势** | **挑战** | |-----------------------------------|-----------------------------------| | 1. 即使HTTPS被破解仍保护敏感数据 | 1. 前端加密代码可能被逆向分析 | | 2. 符合GDPR等数据隐私法规要求 | 2. 加解密增加前后端计算开销 | | 3. 防止内部人员窥探传输数据 | 3. 密钥轮换机制需要完善设计 | --- 通过组合使用HTTPS传输加密和敏感字段二次加密,可构建纵深防御体系。需注意:**安全性与便利性需要平衡**,建议只对身份证号、银行卡号等高敏感字段实施二次加密
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值