JSEncrypt 库 :
- 引入了 jsencrypt/bin/jsencrypt.min
- 需要在项目中安装 jsencrypt 包
npm install jsencrypt
import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'// 密钥对生成 http://web.chacuo.net/netrsakeypairconst publicKey = 'MFwAAQ=='const privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY\n' +'7Nt+PrgrxkiA50efORdI5U5lY='// 加密
export function encrypt(txt) {const encryptor = new JSEncrypt()encryptor.setPublicKey(publicKey) // 设置公钥return encryptor.encrypt(txt) // 对数据进行加密
}// 解密
export function decrypt(txt) {const encryptor = new JSEncrypt()encryptor.setPrivateKey(privateKey) // 设置私钥return encryptor.decrypt(txt) // 对数据进行解密
}
这个页面是根据路由转的,再url的参数上把他们合为一个json对象再加密
点击的页面根据路由监听获取数据,先解密再解析json对象
因为这里有一个二维码功能,二维码的网址对应也需要加密,所以后端也需要加密,后端也使用的
RSA加密,配置公钥为前端的公钥进行加密
public String qrcode(Long id) {try {Wn wn = this.wnMapper.selectWnById(id);if (wn == null) {throw new RuntimeException("微脑信息不存在");}String dateStr = DateUtils.parseDateToStr("yyyyMMdd", new Date());String basePath = profilePath + "/qccode/" + dateStr + "/" + id;String basepathtourl = "/profile/qccode/" + dateStr + "/" + id + "/qrcode.png";// 创建目录(如果不存在)File dir = new File(basePath);if (!dir.exists()) {dir.mkdirs();}String qrCodePath = basePath + "/qrcode.png";// 使用 Hutool 生成二维码QrCodeUtil.generate(RSAEncryptor.generateQrCodeUrl(wn), 300, 300, FileUtil.file(qrCodePath));return basepathtourl;} catch (Exception e) {throw new RuntimeException("生成二维码失败: " + e.getMessage(), e);}}
package com.smart.common.utils.uuid;import com.smart.project.wn.domain.Wn;import javax.crypto.Cipher;
import java.net.URLEncoder;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;public class RSAEncryptor {private static final String PUBLIC_KEY = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==";public static String encrypt(String data) throws Exception {// 处理公钥字符串String publicKeyPEM = PUBLIC_KEY.replace("\\n", "").replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "");// 添加额外的安全检查,确保 Base64 字符串合法if (!isValidBase64(publicKeyPEM)) {throw new IllegalArgumentException("Invalid Base64 string for public key");}byte[] encoded = Base64.getDecoder().decode(publicKeyPEM);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encoded);PublicKey pubKey = KeyFactory.getInstance("RSA").generatePublic(keySpec);Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");cipher.init(Cipher.ENCRYPT_MODE, pubKey);byte[] encryptedBytes = cipher.doFinal(data.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);}// 新增 Base64 验证工具方法private static boolean isValidBase64(String input) {try {Base64.getDecoder().decode(input);return true;} catch (IllegalArgumentException e) {return false;}}public static String generateQrCodeUrl(Wn wn) throws Exception {String baseUrl = "http://192.168.0.7";// 创建包含wnId和wnNum的JSON对象String jsonData = String.format("{\"wnId\":\"%s\",\"wnNum\":\"%s\"}", wn.getId(), wn.getWnNum());String encryptedData = encrypt(jsonData);return baseUrl + "/wn/WnDetail?data=" + URLEncoder.encode(encryptedData, "UTF-8");
}
}