Files
mgm-daylight-mcrm-api-mobile/src/main/java/com/mgm/mcrm/common/utils/AESUtil.java
T
2026-09-08 15:12:29 +08:00

156 lines
5.9 KiB
Java

package com.mgm.mcrm.common.utils;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Base64;
import java.util.Map;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.Permission;
import java.security.PermissionCollection;
import java.security.SecureRandom;
import com.alibaba.fastjson.JSONObject;
public class AESUtil {
private static final String AES = "AES";
private static final int GCM_IV_LENGTH = 12; // GCM推荐使用12字节的IV
private static final int GCM_TAG_LENGTH = 16; // GCM认证标签长度(128位)
private static java.util.Base64.Encoder base64Encoder = java.util.Base64.getEncoder();
private static java.util.Base64.Decoder base64Decoder = java.util.Base64.getDecoder();
static {
java.security.Security.setProperty("crypto.policy", "unlimited");
removeCryptographyRestrictions();
}
public static void removeCryptographyRestrictions() {
try {
/*
* Do the following, but with reflection to bypass access checks:
* JceSecurity.isRestricted = false;
* JceSecurity.defaultPolicy.perms.clear();
* JceSecurity.defaultPolicy.add(CryptoAllPermission.INSTANCE);
*/
final Class<?> jceSecurity = Class.forName("javax.crypto.JceSecurity");
final Class<?> cryptoPermissions = Class.forName("javax.crypto.CryptoPermissions");
final Class<?> cryptoAllPermission = Class.forName("javax.crypto.CryptoAllPermission");
final Field isRestrictedField = jceSecurity.getDeclaredField("isRestricted");
isRestrictedField.setAccessible(true);
// 去除isRestricted的final限制
final Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(isRestrictedField, isRestrictedField.getModifiers() & ~Modifier.FINAL);
isRestrictedField.set(null, false);
final Field defaultPolicyField = jceSecurity.getDeclaredField("defaultPolicy");
defaultPolicyField.setAccessible(true);
final PermissionCollection defaultPolicy = (PermissionCollection) defaultPolicyField.get(null);
final Field perms = cryptoPermissions.getDeclaredField("perms");
perms.setAccessible(true);
((Map<?, ?>) perms.get(defaultPolicy)).clear();
final Field instance = cryptoAllPermission.getDeclaredField("INSTANCE");
instance.setAccessible(true);
defaultPolicy.add((Permission) instance.get(null));
} catch (final Exception e) {
e.printStackTrace();
}
}
public static SecretKey generateKey() throws Exception {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256);
return keyGen.generateKey();
}
public static SecretKey stringToSecretKey(String keyString) {
byte[] keyBytes = base64Decoder.decode(keyString);
return new SecretKeySpec(keyBytes, AES);
}
public static String secretKeyToString(SecretKey secretKey) {
byte[] keyBytes = secretKey.getEncoded();
return base64Encoder.encodeToString(keyBytes);
}
/**
* AES加密
*/
public static String AES256Encrypt(String key, String content) {
try {
SecretKey secretKey = stringToSecretKey(key);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
byte[] iv = new byte[GCM_IV_LENGTH];
SecureRandom secureRandom = new SecureRandom();
secureRandom.nextBytes(iv); // 生成随机的IV
GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, spec);
byte[] ciphertext = cipher.doFinal(content.getBytes());
byte[] encryptedData = new byte[iv.length + ciphertext.length];
System.arraycopy(iv, 0, encryptedData, 0, iv.length);
System.arraycopy(ciphertext, 0, encryptedData, iv.length, ciphertext.length);
return base64Encoder.encodeToString(encryptedData);
} catch (Exception e) {
//e.printStackTrace();
}
return null;
}
/**
* AES解密
*/
public static String AES256Decrypt(String key, String content) {
try {
SecretKey secretKey = stringToSecretKey(key);
byte[] encryptedData = base64Decoder.decode(content);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
// 从加密数据中提取IV
byte[] iv = new byte[GCM_IV_LENGTH];
System.arraycopy(encryptedData, 0, iv, 0, iv.length);
GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);
cipher.init(Cipher.DECRYPT_MODE, secretKey, spec);
// 解密数据
byte[] ciphertext = new byte[encryptedData.length - GCM_IV_LENGTH];
System.arraycopy(encryptedData, GCM_IV_LENGTH, ciphertext, 0, ciphertext.length);
byte[] byteDecode = cipher.doFinal(ciphertext);
return new String(byteDecode, java.nio.charset.StandardCharsets.UTF_8);
} catch (Exception e) {
//e.printStackTrace();
}
return null;
}
public static String sha256(String plainString) {
String cipherString = null;
try {
// 获取实例(SHA-512同理)
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
// 计算摘要
byte[] cipherBytes = messageDigest.digest(plainString.getBytes(StandardCharsets.UTF_8));
// 输出为16进制字符串
StringBuilder sb = new StringBuilder();
for (byte b : cipherBytes) {
sb.append(String.format("%02x", b));
}
cipherString = sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
return cipherString;
}
}