1、pom中引用相关依赖
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
<version>1.46</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.12</version>
</dependency>
2、新建CryptoUtils工具类
package com.common.utils.security;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class CryptoUtils {
/***
* key和iv值可以随机生成,确保与前端的key,iv对应
*/
private static String KEY = "abcdefghijklmn33";
private static String IV = "abcdefghijklmn33";
public static String byteToString(byte[] byte1){
return new String(byte1);
}
public static byte[] AES_CBC_Encrypt(byte[] content){
try {
byte[] keyBytes= KEY.getBytes();
byte[] iv=IV.getBytes();
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE,key, new IvParameterSpec(iv));
byte[] result = cipher.doFinal(content);
return result;
} catch (Exception e) {
System.out.println("exception:"+e.toString());
}
return null;
}
public static byte[] AES_CBC_Decrypt(byte[] content){
try {
byte[] keyBytes= KEY.getBytes();
byte[] iv=IV.getBytes();
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.DECRYPT_MODE,key, new IvParameterSpec(iv));
byte[] result = cipher.doFinal(content);
return result;
} catch (Exception e) {
System.out.println("exception:"+e.toString());
}
return null;
}
//字符串装换成base64
public static byte[] decryptBASE64(String key) throws Exception {
return Base64.decodeBase64(key.getBytes());
}
//base64装换成字符串
public static String encryptBASE64(byte[] key) throws Exception {
return new String(Base64.encodeBase64(key));
}
}
3、调用算法
// mac授权检查
@GetMapping("/check")
@ResponseBody
public AjaxResult checkAccept(String linces) throws Exception {
String res="";
//进行解密
//解密
byte[] decrypted = new byte[0];
try {
decrypted = CryptoUtils.AES_CBC_Decrypt(CryptoUtils.decryptBASE64(linces));
} catch (Exception e) {
e.printStackTrace();
}
String str = CryptoUtils.byteToString(decrypted);
// "localhost|eln.qunaj.cn,2023-08-31 23:59:59";
//检查mac地址是否是授权机器地址
String mac="";
//获取本机mac
InetAddress inetAddress = InetAddress.getLocalHost();
//利用hutool工具类中的封装方法获取本机mac地址
ArrayList<String> macs = getLocalMac();
String [] lsttmp=str.split(","); //第三个为mac地址
String macstr=lsttmp[2].toString().trim();
boolean flagMac=false;
if(macs.contains(macstr)){
flagMac=true;
}
if(!flagMac){
//报错,mac地址不匹配
res="error|mac地址不匹配,服务器Mac:"+mac;
}else {
//mac地址正确,把服务器时间加密传给前端
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = sdf.format(date);
res="success|"+formattedDate;
}
// CryptoUtils.AES_CBC_Encrypt(res.getBytes());
return AjaxResult.success(CryptoUtils.encryptBASE64(CryptoUtils.AES_CBC_Encrypt(res.getBytes())));
}
4、获取服务器Mac地址算法
private ArrayList<String> getLocalMac() {
ArrayList addressLst=new ArrayList<String>();
try {
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = networkInterfaces.nextElement();
byte[] macAddress = networkInterface.getHardwareAddress();
if (macAddress != null) {
String tmpStr="";
// System.out.print("MAC address for " + networkInterface.getName() + ": ");
for (int i = 0; i < macAddress.length; i++) {
System.out.format("%02X%s", macAddress[i], (i < macAddress.length - 1) ? "-" : "");
// if(tmpStr==""){
tmpStr= tmpStr+ String.format("%02X%s", macAddress[i], (i < macAddress.length - 1) ? "-" : "");
// }
// else {
// tmpStr= tmpStr+"-"+macAddress[i];
// }
}
addressLst.add(tmpStr);
// System.out.println();
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return addressLst;
}