场景还原:页面中需要展示手机号,身份证号,因为是前后端分离,所有接口API地址有可能暴露,这样不怀好意的人可以拿到个人敏感信息
解决方案:
1. 敏感信息加掩码,例如:接口返回130**12这样的手机号。弊端:在有表单中无法实现这种方案。
2. 后端加密,前端解密的方式(本文采用的方式),前后端统一加密方案,salt字符串等信息。弊端:前端js无法做到高级加密,salt可以被查到,但是成本相对较高。
后台加密工具类
package org.jeecg.modules.system.util;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class AesUtils {
private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";
/**
* 加密
*
* @param content
* @param key
* @return
*/
public static String encrypt(String content, String key) {
try {
//获得密码的字节数组
byte[] raw = key.getBytes();
//根据密码生成AES密钥
SecretKeySpec skey = new SecretKeySpec(raw, "AES");
//根据指定算法ALGORITHM自成密码器
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
//初始化密码器,第一个参数为加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操作,第二个参数为生成的AES密钥
cipher.init(Cipher.ENCRYPT_MODE, skey);
//获取加密内容的字节数组(设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
byte[] byte_content = content.getBytes("utf-8");
//密码器加密数据
byte[] encode_content = cipher.doFinal(byte_content);
//将加密后的数据转换为字符串返回
return Base64.encodeBase64String(encode_content);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 解密
*
* @param encryptStr
* @param decryptKey
* @return
*/
public static String decrypt(String encryptStr, String decryptKey) {
try {
//获得密码的字节数组
byte[] raw = decryptKey.getBytes();
//根据密码生成AES密钥
SecretKeySpec skey = new SecretKeySpec(raw, "AES");
//根据指定算法ALGORITHM自成密码器
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
//初始化密码器,第一个参数为加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操作,第二个参数为生成的AES密钥
cipher.init(Cipher.DECRYPT_MODE, skey);
//把密文字符串转回密文字节数组
byte[] encode_content = Base64.decodeBase64(encryptStr);
//密码器解密数据
byte[] byte_content = cipher.doFinal(encode_content);
//将解密后的数据转换为字符串返回
return new String(byte_content, "utf-8");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
前端解密
{
title: '联系方式',
align: 'center',
width:100,
dataIndex: 'phone',
customRender: function(phone,record) {
const key = CryptoJS.enc.Utf8.parse(record.key);
let tel = CryptoJS.AES.decrypt(phone,key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
tel = tel.toString(CryptoJS.enc.Utf8)
return tel;
}
},