1 前端
安装crypto
js工具
| import CryptoJS from 'crypto-js/crypto-js' |
| |
| |
| |
| |
| export function Encrypt(word, keyStr) { |
| let key,iv,ivStr; |
| if (!keyStr) { |
| throw new Error("keyStr 不能为空"); |
| } |
| ivStr = keyStr; |
| key = CryptoJS.enc.Utf8.parse(keyStr); |
| iv = CryptoJS.enc.Utf8.parse(ivStr); |
| let srcs = CryptoJS.enc.Utf8.parse(word); |
| var encrypted = CryptoJS.AES.encrypt(srcs, key, { |
| iv: iv, |
| mode: CryptoJS.mode.CBC, |
| padding: CryptoJS.pad.ZeroPadding |
| }); |
| |
| return CryptoJS.enc.Base64.stringify(encrypted.ciphertext); |
| |
| } |
| |
| |
| |
| export function Decrypt(word, keyStr) { |
| |
| let key,iv,ivStr; |
| if (!keyStr) { |
| throw new Error("keyStr 不能为空"); |
| } |
| ivStr = keyStr; |
| key = CryptoJS.enc.Utf8.parse(keyStr); |
| iv = CryptoJS.enc.Utf8.parse(ivStr); |
| |
| let base64 = CryptoJS.enc.Base64.parse(word); |
| let src = CryptoJS.enc.Base64.stringify(base64); |
| |
| var decrypt = CryptoJS.AES.decrypt(src, key, { |
| iv: iv, |
| mode: CryptoJS.mode.CBC, |
| padding: CryptoJS.pad.ZeroPadding |
| }); |
| |
| var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8); |
| return decryptedStr.toString(); |
| } |
2 后端
| public class AesUtil { |
| |
| |
| |
| |
| |
| |
| |
| public static String encrypt(String data, String key){ |
| try { |
| String iv = key; |
| |
| Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); |
| int blockSize = cipher.getBlockSize(); |
| |
| byte[] dataBytes = data.getBytes(); |
| int plaintextLength = dataBytes.length; |
| if (plaintextLength % blockSize != 0) { |
| plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize)); |
| } |
| |
| byte[] plaintext = new byte[plaintextLength]; |
| System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length); |
| |
| SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES"); |
| IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); |
| |
| cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); |
| byte[] encrypted = cipher.doFinal(plaintext); |
| |
| return new Base64().encodeToString(encrypted); |
| |
| } catch (Exception e) { |
| e.printStackTrace(); |
| return null; |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| public static String desEncrypt(String data, String key) { |
| try { |
| String iv = key; |
| byte[] encrypted1 = new Base64().decode(data); |
| Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); |
| SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES"); |
| IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); |
| |
| cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); |
| |
| byte[] original = cipher.doFinal(encrypted1); |
| String originalString = new String(original, "utf-8"); |
| return originalString; |
| } catch (Exception e) { |
| e.printStackTrace(); |
| return null; |
| } |
| } |
| |
| |
| |
| |
| |
| public static String generateKeyAndIv(){ |
| String uid = SecureUtil.md5(String.valueOf(System.currentTimeMillis())); |
| |
| String salt = UUID.randomUUID().toString(); |
| uid = SecureUtil.md5(uid + salt); |
| return uid.substring(16); |
| } |
| } |
3 使用
前端发送请求时使用工具加密字段
| import {Encrypt} from "@/utils/aesUtil"; |
| |
| let key = "aaaaaaaaaaaaaaaa" |
| let psw = Encrypt(password.trim(),key) |
后端解析
| String psw = AesUtil.desEncrypt(password, "aaaaaaaaaaaaaaaa"); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)