踩过很多坑才总结的jsp加密 java后端解密 大家 有用到帮忙点个赞呗
jsp 代码为:
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
// 这个包如果访问被拒 可以找我
<script> var password= "qwerwsx@."; //需要加密的密码 var sgin = "1234567891234567"; //加密密文 和java后端一致 var passwordNew = CryptoJS.AES.encrypt(password,sgin).toString(); //下面走一个ajax的方法 就不再写了 <script>
java代码: 写一个utill的工具类
import lombok.extern.slf4j.Slf4j; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.security.DigestException; import java.security.MessageDigest; import java.util.Arrays;
@Slf4j public class AES {
public static String aesEncrypt(String datastr, String secret) { try { byte[] input = datastr.getBytes(); // 以下两个变量不可修改,否则java加密的,node无法解密 byte[] saltData = "DFބf$t:".getBytes(); byte[] preData = "Salted__".getBytes(); MessageDigest md5 = MessageDigest.getInstance("MD5"); final byte[][] keyAndIV = GenerateKeyAndIV(32, 16, 1, saltData, secret.getBytes(StandardCharsets.UTF_8), md5); SecretKeySpec key = new SecretKeySpec(keyAndIV[0], "AES"); IvParameterSpec iv = new IvParameterSpec(keyAndIV[1]); Cipher aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding"); aesCBC.init(Cipher.ENCRYPT_MODE, key, iv); byte[] encrypt = aesCBC.doFinal(input); byte[] encryptedData = addBytes(saltData, encrypt); return cn.hutool.core.codec.Base64.encode(addBytes(preData, encryptedData)); } catch (Exception e) { log.error("aesEncrypt error.param={}", datastr, e); return null; } } public static String aesDecrypt(String encryptedText, String secret) { // 参考文章:https://www.pianshen.com/question/31931314701/ try { byte[] cipherData = cn.hutool.core.codec.Base64.decode(encryptedText); byte[] saltData = Arrays.copyOfRange(cipherData, 8, 16); MessageDigest md5 = MessageDigest.getInstance("MD5"); final byte[][] keyAndIV = GenerateKeyAndIV(32, 16, 1, saltData, secret.getBytes(StandardCharsets.UTF_8), md5); SecretKeySpec key = new SecretKeySpec(keyAndIV[0], "AES"); IvParameterSpec iv = new IvParameterSpec(keyAndIV[1]); byte[] encrypted = Arrays.copyOfRange(cipherData, 16, cipherData.length); Cipher aesCBC = Cipher.getInstance("AES/CBC/PKCS5Padding"); aesCBC.init(Cipher.DECRYPT_MODE, key, iv); byte[] decryptedData = aesCBC.doFinal(encrypted); return new String(decryptedData, StandardCharsets.UTF_8); } catch (Exception e) { log.error("aesDecrypt error.param={}", encryptedText, e); return null; } } public static byte[][] GenerateKeyAndIV(int keyLength, int ivLength, int iterations, byte[] salt, byte[] password, MessageDigest md) { int digestLength = md.getDigestLength(); int requiredLength = (keyLength + ivLength + digestLength - 1) / digestLength * digestLength; byte[] generatedData = new byte[requiredLength]; int generatedLength = 0; try { md.reset(); // Repeat process until sufficient data has been generated while (generatedLength < keyLength + ivLength) { // Digest data (last digest if available, password data, salt if available) if (generatedLength > 0) md.update(generatedData, generatedLength - digestLength, digestLength); md.update(password); if (salt != null) md.update(salt, 0, 8); md.digest(generatedData, generatedLength, digestLength); // additional rounds for (int i = 1; i < iterations; i++) { md.update(generatedData, generatedLength, digestLength); md.digest(generatedData, generatedLength, digestLength); } generatedLength += digestLength; } // Copy key and IV into separate byte arrays byte[][] result = new byte[2][]; result[0] = Arrays.copyOfRange(generatedData, 0, keyLength); if (ivLength > 0) result[1] = Arrays.copyOfRange(generatedData, keyLength, keyLength + ivLength); return result; } catch (DigestException e) { throw new RuntimeException(e); } finally { // Clean out temporary data Arrays.fill(generatedData, (byte) 0); } } public static byte[] addBytes(byte[] data1, byte[] data2) { byte[] data3 = new byte[data1.length + data2.length]; System.arraycopy(data1, 0, data3, 0, data1.length); System.arraycopy(data2, 0, data3, data1.length, data2.length); return data3; } }
加密方法调用AES.aesEncrypt("需要加密的密码","加密的密文和前端保持一致")
解密方法调用AES.aesDecrypt("加密过的密文","加密的密文和前端保持一致")
小编不易帮忙点个赞呗