From 8af32e42a0c6329549e71442468d3a378ab156de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=B7=E8=A8=80?= <2439534736@qq.com> Date: Mon, 1 Jun 2026 14:30:10 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix(security):=20=E4=BF=AE=E5=A4=8DRSA?= =?UTF-8?q?=E5=8A=A0=E5=AF=86=E5=B7=A5=E5=85=B7=E7=B1=BB=E4=B8=AD=E7=9A=84?= =?UTF-8?q?Base64=E7=BC=96=E7=A0=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 替换Base64编码方法从getUrlEncoder到encodeBase64URLSafeString - 替换Base64解码方法从getUrlDecoder到decodeBase64URLSafe - 更新公钥和私钥的编码方式以确保兼容性 - 修改rsaSplitCodec方法中的资源管理避免内存泄漏 - 启用并修复main方法中的测试代码验证加密解密功能 --- .../cn/xf/basedemo/common/utils/RSAUtils.java | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/src/main/java/cn/xf/basedemo/common/utils/RSAUtils.java b/src/main/java/cn/xf/basedemo/common/utils/RSAUtils.java index 667d729..6a39981 100644 --- a/src/main/java/cn/xf/basedemo/common/utils/RSAUtils.java +++ b/src/main/java/cn/xf/basedemo/common/utils/RSAUtils.java @@ -1,5 +1,8 @@ package cn.xf.basedemo.common.utils; +import org.apache.tomcat.util.codec.binary.Base64; +import org.apache.tomcat.util.http.fileupload.IOUtils; + import javax.crypto.Cipher; import java.io.ByteArrayOutputStream; import java.security.*; @@ -18,7 +21,7 @@ import java.util.Map; * @description: 加密工具类 * @author: xiongfeng * @create: 2022-06-20 10:37 - * **/ + **/ public class RSAUtils { //算法类型 @@ -47,10 +50,10 @@ public class RSAUtils { kpg.initialize(ENCRYPT_SIZE); KeyPair keyPair = kpg.generateKeyPair(); PublicKey aPublic = keyPair.getPublic(); - String publicKey = Base64.getUrlEncoder().withoutPadding().encodeToString(aPublic.getEncoded()); + String publicKey = Base64.encodeBase64URLSafeString(aPublic.getEncoded()); PrivateKey aPrivate = keyPair.getPrivate(); - String privateKey = Base64.getUrlEncoder().withoutPadding().encodeToString(aPrivate.getEncoded()); + String privateKey = Base64.encodeBase64URLSafeString(aPrivate.getEncoded()); Map map = new HashMap<>(); @@ -71,7 +74,7 @@ public class RSAUtils { public static RSAPublicKey getPublicKey(String publicKeyStr) throws NoSuchAlgorithmException, InvalidKeySpecException { // 通过X509编码的Key指令获得公钥对象 KeyFactory keyFactory = KeyFactory.getInstance(RSA); - X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.getUrlDecoder().decode(publicKeyStr)); + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64URLSafe(publicKeyStr)); RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec); return key; } @@ -87,7 +90,7 @@ public class RSAUtils { public static RSAPrivateKey getPrivateKey(String privateKeyStr) throws NoSuchAlgorithmException, InvalidKeySpecException { KeyFactory keyFactory = KeyFactory.getInstance(RSA); - PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.getUrlDecoder().decode(privateKeyStr)); + PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64URLSafe(privateKeyStr)); RSAPrivateKey privateKey = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8EncodedKeySpec); return privateKey; } @@ -107,7 +110,8 @@ public class RSAUtils { cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] bytes = cipher.doFinal(data.getBytes()); - return Base64.getUrlEncoder().withoutPadding().encodeToString(bytes); + return Base64.encodeBase64URLSafeString(bytes); +// return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), publicKey.getModulus().bitLength())); } catch (Exception e) { throw new RuntimeException(); } @@ -118,7 +122,9 @@ public class RSAUtils { Cipher cipher = Cipher.getInstance(RSA); cipher.init(Cipher.DECRYPT_MODE, privateKey); - return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.getUrlDecoder().decode(data.getBytes(CHARSET)), privateKey.getModulus().bitLength()), CHARSET); +// byte[] bytes = cipher.doFinal(Base64.decodeBase64(data.getBytes(CHARSET))); +// return new String(bytes); + return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data.getBytes(CHARSET), 0, data.getBytes(CHARSET).length), privateKey.getModulus().bitLength()), CHARSET); } catch (Exception e) { throw new RuntimeException("解密字符串[" + data + "]时遇到异常", e); } @@ -132,10 +138,11 @@ public class RSAUtils { } else { maxBlock = keySize / 8 - 11; } + ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; + byte[] buff; int i = 0; - try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { - byte[] buff; + try { while (datas.length > offSet) { if (datas.length - offSet > maxBlock) { //可以调用以下的doFinal()方法完成加密或解密数据: @@ -147,33 +154,32 @@ public class RSAUtils { i++; offSet = i * maxBlock; } - return out.toByteArray(); } catch (Exception e) { throw new RuntimeException("加解密阀值为[" + maxBlock + "]的数据时发生异常", e); } + byte[] resultDatas = out.toByteArray(); + IOUtils.closeQuietly(out); + return resultDatas; } public static void main(String[] args) { -// Map encryptKey = createEncryptKey(); -// String publicKey = encryptKey.get("publicKey"); -// String privateKey = encryptKey.get("privateKey"); -// -// System.out.println("公匙加密串:" + publicKey); -// System.out.println("私匙加密串:" + privateKey); -// -// System.out.println(); + Map encryptKey = createEncryptKey(); + String publicKey = encryptKey.get("publicKey"); + String privateKey = encryptKey.get("privateKey"); + + System.out.println("公匙加密串:" + publicKey); + System.out.println("私匙加密串:" + privateKey); + + System.out.println(); // String data = "data"; //加密 try { - String s = publicEncrypt(data, getPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC_F5UQC1QWsu3QsESQBz9M-GDA9Atm0qVSvwIsy568lyRLi-nq3VvvnmgrlL4yTbngFzyfb2Dn35cNCHsBvIaGuCY3_PpzPqMzVpxr2QlEkhEX9atnJQ1rWexS8QeZtPjpiIwoQrChTzXjD_sYUkDrqSykFplyivf0NSO2WqCBdwIDAQAB")); + String s = publicEncrypt(data, getPublicKey(publicKey)); System.out.println("加密后密文:" + s); - -// String ss = "bPrP3VQpVNj7jxzSvVRQQpOCzg4c9HAMd/Sesda0SOxmWbNzP8SnhayV2H9Jpih2sf26O8dOqiNE7V1u5NPgQBIPi6LqX2QiFTjynVLxQBUmISfmQ2Q6K3sjHBIRIhuZPrXijw7CextUUQwzh4VvEVkjyaUnqlMXVRkUGlgqP7M="; -// String privateKey1 = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBALiJJ6RPMMh-ETrmppOG7JKINPSFaaZoHjzZkyQl3AcfrpKMmH82j_Pxl4mPvvgKtbR20N-88-nJLT4v4aOz9XYVl5ruE59SsJl_T8YqN-i8L8KH8Wptd0_ee7nDhF4-OGEi-o330daFv20eLpboy6nDkWLmLihKC0jEZWK8MLZzAgMBAAECgYAEhO9gmcPjFRtM6vsnX8WJbSaG2oGU3rXm3Zk56Gd0ETWQRzsw2mA6JC-G4etWXcTHb6V75T-_-PpPrJKFFNItEH-WFRS36xneomycxRG1YTfK1SsGLGF0BV3bLVZx8cQz7VsBY4vqbRCSKtcOZBJpnxI6iHAv07i8w34F6qjfsQJBAORnKUuJQ_GsHHBPT1VhMYjXVepAfTrWtCzRQ648KavbHLAGaRIhX10uj-hAhZLafDqQF8Y7T7GHTlasRL9ubWsCQQDO1R3KScJJSR3KDsnSsF0YCw7V28cr_OVAwiPoro90Me6MUz9yKV88gQlTuJkNFMuu_YdPXYKjlzNVg0zFmtUZAkEAoe9mPtDeZD0TmKkSZUVYul1543C_mPTan5_qrWCoZtkd2MtiuWEB3O4DR7ZfPcQ8KcU5pektUn_NEfRndZYUawJBAJfydOoxeawBLQNODfLcYefR59owlYe5SGpktaCw7O596DPqzId_4Vk_qqx4xueXSXOLCabCmcC4yZue0_2vm7ECQQDLrzXL-BpSqxbvtE0gNKcgaSkEUSOh1QmQFPCHERsOBxcflM6ej71STKglB21JD9m6tM2RySgbtUx4TfOuJTek"; -// String s1 = privateDecryption(ss, getPrivateKey(privateKey1)); -// System.out.println("解密后明文:" + s1); + String s1 = privateDecryption(s, getPrivateKey(privateKey)); + System.out.println("解密后明文:" + s1); } catch (Exception e) { throw new IllegalArgumentException(); From 8f5f3f137d7775567d0ba1f09dc7f2a1b44ef3c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=B7=E8=A8=80?= <2439534736@qq.com> Date: Mon, 1 Jun 2026 14:34:53 +0800 Subject: [PATCH 2/3] =?UTF-8?q?refactor(RSAUtils):=20=E7=A7=BB=E9=99=A4Bas?= =?UTF-8?q?e64=E4=BE=9D=E8=B5=96=E5=B9=B6=E4=BC=98=E5=8C=96=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除了java.util.Base64的导入语句 - 注释掉了main方法中的动态密钥生成功能 - 使用固定密钥对进行加密解密测试 - 简化了测试代码结构并移除多余空行 --- .../cn/xf/basedemo/common/utils/RSAUtils.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/cn/xf/basedemo/common/utils/RSAUtils.java b/src/main/java/cn/xf/basedemo/common/utils/RSAUtils.java index 6a39981..eb07323 100644 --- a/src/main/java/cn/xf/basedemo/common/utils/RSAUtils.java +++ b/src/main/java/cn/xf/basedemo/common/utils/RSAUtils.java @@ -11,7 +11,6 @@ import java.security.interfaces.RSAPublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; -import java.util.Base64; import java.util.HashMap; import java.util.Map; @@ -164,21 +163,24 @@ public class RSAUtils { public static void main(String[] args) { - Map encryptKey = createEncryptKey(); - String publicKey = encryptKey.get("publicKey"); - String privateKey = encryptKey.get("privateKey"); - - System.out.println("公匙加密串:" + publicKey); - System.out.println("私匙加密串:" + privateKey); - - System.out.println(); +// Map encryptKey = createEncryptKey(); +// String publicKey = encryptKey.get("publicKey"); +// String privateKey = encryptKey.get("privateKey"); +// +// System.out.println("公匙加密串:" + publicKey); +// System.out.println("私匙加密串:" + privateKey); +// +// System.out.println(); // String data = "data"; //加密 try { - String s = publicEncrypt(data, getPublicKey(publicKey)); + String s = publicEncrypt(data, getPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC_F5UQC1QWsu3QsESQBz9M-GDA9Atm0qVSvwIsy568lyRLi-nq3VvvnmgrlL4yTbngFzyfb2Dn35cNCHsBvIaGuCY3_PpzPqMzVpxr2QlEkhEX9atnJQ1rWexS8QeZtPjpiIwoQrChTzXjD_sYUkDrqSykFplyivf0NSO2WqCBdwIDAQAB")); System.out.println("加密后密文:" + s); - String s1 = privateDecryption(s, getPrivateKey(privateKey)); + + String ss = "bPrP3VQpVNj7jxzSvVRQQpOCzg4c9HAMd/Sesda0SOxmWbNzP8SnhayV2H9Jpih2sf26O8dOqiNE7V1u5NPgQBIPi6LqX2QiFTjynVLxQBUmISfmQ2Q6K3sjHBIRIhuZPrXijw7CextUUQwzh4VvEVkjyaUnqlMXVRkUGlgqP7M="; + String privateKey1 = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBALiJJ6RPMMh-ETrmppOG7JKINPSFaaZoHjzZkyQl3AcfrpKMmH82j_Pxl4mPvvgKtbR20N-88-nJLT4v4aOz9XYVl5ruE59SsJl_T8YqN-i8L8KH8Wptd0_ee7nDhF4-OGEi-o330daFv20eLpboy6nDkWLmLihKC0jEZWK8MLZzAgMBAAECgYAEhO9gmcPjFRtM6vsnX8WJbSaG2oGU3rXm3Zk56Gd0ETWQRzsw2mA6JC-G4etWXcTHb6V75T-_-PpPrJKFFNItEH-WFRS36xneomycxRG1YTfK1SsGLGF0BV3bLVZx8cQz7VsBY4vqbRCSKtcOZBJpnxI6iHAv07i8w34F6qjfsQJBAORnKUuJQ_GsHHBPT1VhMYjXVepAfTrWtCzRQ648KavbHLAGaRIhX10uj-hAhZLafDqQF8Y7T7GHTlasRL9ubWsCQQDO1R3KScJJSR3KDsnSsF0YCw7V28cr_OVAwiPoro90Me6MUz9yKV88gQlTuJkNFMuu_YdPXYKjlzNVg0zFmtUZAkEAoe9mPtDeZD0TmKkSZUVYul1543C_mPTan5_qrWCoZtkd2MtiuWEB3O4DR7ZfPcQ8KcU5pektUn_NEfRndZYUawJBAJfydOoxeawBLQNODfLcYefR59owlYe5SGpktaCw7O596DPqzId_4Vk_qqx4xueXSXOLCabCmcC4yZue0_2vm7ECQQDLrzXL-BpSqxbvtE0gNKcgaSkEUSOh1QmQFPCHERsOBxcflM6ej71STKglB21JD9m6tM2RySgbtUx4TfOuJTek"; + String s1 = privateDecryption(ss, getPrivateKey(privateKey1)); System.out.println("解密后明文:" + s1); } catch (Exception e) { @@ -187,6 +189,4 @@ public class RSAUtils { } - - -} +} \ No newline at end of file From 217e931806f7baa2cba57d716ade1d1d39ee5ef8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=B7=E8=A8=80?= <2439534736@qq.com> Date: Mon, 1 Jun 2026 15:14:04 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix(security):=20=E4=BF=AE=E5=A4=8DRSA?= =?UTF-8?q?=E5=8A=A0=E5=AF=86=E5=AE=9E=E7=8E=B0=E5=B9=B6=E7=A7=BB=E9=99=A4?= =?UTF-8?q?BCrypt=E5=AF=86=E7=A0=81=E7=BC=96=E7=A0=81=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在login.html中添加HTML语言声明和密码显示功能 - 重构前端RSA加密逻辑,支持大数据块分片加密 - 更新RSAUtils.java中的加密算法,使用标准PKCS1填充模式 - 移除UserService中不必要的BCryptPasswordEncoder依赖 - 简化success.html页面的参数解析逻辑 - 统一前后端RSA加密解密的实现方式 --- .../cn/xf/basedemo/common/utils/RSAUtils.java | 240 +++++++----------- .../service/impl/UserServiceImpl.java | 5 +- src/main/resources/templates/login.html | 118 +++++---- src/main/resources/templates/success.html | 47 ++-- 4 files changed, 181 insertions(+), 229 deletions(-) diff --git a/src/main/java/cn/xf/basedemo/common/utils/RSAUtils.java b/src/main/java/cn/xf/basedemo/common/utils/RSAUtils.java index eb07323..c23da8e 100644 --- a/src/main/java/cn/xf/basedemo/common/utils/RSAUtils.java +++ b/src/main/java/cn/xf/basedemo/common/utils/RSAUtils.java @@ -1,192 +1,134 @@ package cn.xf.basedemo.common.utils; -import org.apache.tomcat.util.codec.binary.Base64; -import org.apache.tomcat.util.http.fileupload.IOUtils; - import javax.crypto.Cipher; import java.io.ByteArrayOutputStream; -import java.security.*; +import java.nio.charset.StandardCharsets; +import java.security.KeyFactory; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.PrivateKey; +import java.security.PublicKey; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; +import java.util.Base64; import java.util.HashMap; import java.util.Map; -/** - * @program: xf-boot-base - * @ClassName RSAUtils - * @description: 加密工具类 - * @author: xiongfeng - * @create: 2022-06-20 10:37 - **/ public class RSAUtils { - //算法类型 private static final String RSA = "RSA"; + private static final String RSA_TRANSFORMATION = "RSA/ECB/PKCS1Padding"; + private static final int KEY_SIZE = 1024; - //字符编码类型 - private static final String CHARSET = "UTF-8"; - - //加密长度 - private static final int ENCRYPT_SIZE = 1024; - - - /** - * 创建rsa密匙对 - * - * @return - */ private static Map createEncryptKey() { - - KeyPairGenerator kpg; try { - kpg = KeyPairGenerator.getInstance(RSA); + KeyPairGenerator kpg = KeyPairGenerator.getInstance(RSA); + kpg.initialize(KEY_SIZE); + KeyPair keyPair = kpg.generateKeyPair(); + + PublicKey publicKey = keyPair.getPublic(); + PrivateKey privateKey = keyPair.getPrivate(); + + Map map = new HashMap<>(); + map.put("publicKey", Base64.getEncoder().encodeToString(publicKey.getEncoded())); + map.put("privateKey", Base64.getEncoder().encodeToString(privateKey.getEncoded())); + return map; } catch (Exception e) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException("create RSA key pair failed", e); } - kpg.initialize(ENCRYPT_SIZE); - KeyPair keyPair = kpg.generateKeyPair(); - PublicKey aPublic = keyPair.getPublic(); - String publicKey = Base64.encodeBase64URLSafeString(aPublic.getEncoded()); - - PrivateKey aPrivate = keyPair.getPrivate(); - String privateKey = Base64.encodeBase64URLSafeString(aPrivate.getEncoded()); - - Map map = new HashMap<>(); - - map.put("publicKey", publicKey); - map.put("privateKey", privateKey); - - return map; } - /** - * 获取ras公匙 - * - * @param publicKeyStr 公匙加密字符串 - * @return - * @throws NoSuchAlgorithmException - * @throws InvalidKeySpecException - */ - public static RSAPublicKey getPublicKey(String publicKeyStr) throws NoSuchAlgorithmException, InvalidKeySpecException { - // 通过X509编码的Key指令获得公钥对象 - KeyFactory keyFactory = KeyFactory.getInstance(RSA); - X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64URLSafe(publicKeyStr)); - RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec); - return key; - } - - /** - * 获取ras私匙 - * - * @param privateKeyStr 私匙加密字符串 - * @return - * @throws NoSuchAlgorithmException - * @throws InvalidKeySpecException - */ - public static RSAPrivateKey getPrivateKey(String privateKeyStr) throws NoSuchAlgorithmException, InvalidKeySpecException { - - KeyFactory keyFactory = KeyFactory.getInstance(RSA); - PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64URLSafe(privateKeyStr)); - RSAPrivateKey privateKey = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8EncodedKeySpec); - return privateKey; - } - - /** - * 公匙加密 - * - * @param data 字符串 - * @param publicKey - * @return - */ - public static String publicEncrypt(String data, RSAPublicKey publicKey) { - + public static RSAPublicKey getPublicKey(String publicKeyStr) throws InvalidKeySpecException { try { - - Cipher cipher = Cipher.getInstance(RSA); - cipher.init(Cipher.ENCRYPT_MODE, publicKey); - - byte[] bytes = cipher.doFinal(data.getBytes()); - return Base64.encodeBase64URLSafeString(bytes); -// return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), publicKey.getModulus().bitLength())); + KeyFactory keyFactory = KeyFactory.getInstance(RSA); + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodeBase64(publicKeyStr)); + return (RSAPublicKey) keyFactory.generatePublic(keySpec); + } catch (InvalidKeySpecException e) { + throw e; } catch (Exception e) { - throw new RuntimeException(); + throw new InvalidKeySpecException("invalid RSA public key", e); + } + } + + public static RSAPrivateKey getPrivateKey(String privateKeyStr) throws InvalidKeySpecException { + try { + KeyFactory keyFactory = KeyFactory.getInstance(RSA); + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodeBase64(privateKeyStr)); + return (RSAPrivateKey) keyFactory.generatePrivate(keySpec); + } catch (InvalidKeySpecException e) { + throw e; + } catch (Exception e) { + throw new InvalidKeySpecException("invalid RSA private key", e); + } + } + + public static String publicEncrypt(String data, RSAPublicKey publicKey) { + try { + Cipher cipher = Cipher.getInstance(RSA_TRANSFORMATION); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + byte[] encrypted = rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, + data.getBytes(StandardCharsets.UTF_8), publicKey.getModulus().bitLength()); + return Base64.getEncoder().encodeToString(encrypted); + } catch (Exception e) { + throw new RuntimeException("RSA encrypt failed", e); } } public static String privateDecryption(String data, RSAPrivateKey privateKey) { try { - Cipher cipher = Cipher.getInstance(RSA); + Cipher cipher = Cipher.getInstance(RSA_TRANSFORMATION); cipher.init(Cipher.DECRYPT_MODE, privateKey); - -// byte[] bytes = cipher.doFinal(Base64.decodeBase64(data.getBytes(CHARSET))); -// return new String(bytes); - return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data.getBytes(CHARSET), 0, data.getBytes(CHARSET).length), privateKey.getModulus().bitLength()), CHARSET); + byte[] decrypted = rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, + decodeBase64(data), privateKey.getModulus().bitLength()); + return new String(decrypted, StandardCharsets.UTF_8); } catch (Exception e) { - throw new RuntimeException("解密字符串[" + data + "]时遇到异常", e); + throw new RuntimeException("RSA decrypt failed", e); + } + } + + private static byte[] decodeBase64(String data) { + String normalizedData = data.replaceAll("\\s", ""); + try { + return Base64.getDecoder().decode(normalizedData); + } catch (IllegalArgumentException e) { + return Base64.getUrlDecoder().decode(normalizedData); } } - //rsa切割解码 , ENCRYPT_MODE,加密数据 ,DECRYPT_MODE,解密数据 private static byte[] rsaSplitCodec(Cipher cipher, int opmode, byte[] datas, int keySize) { - int maxBlock = 0; //最大块 - if (opmode == Cipher.DECRYPT_MODE) { - maxBlock = keySize / 8; - } else { - maxBlock = keySize / 8 - 11; - } - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int offSet = 0; - byte[] buff; - int i = 0; - try { - while (datas.length > offSet) { - if (datas.length - offSet > maxBlock) { - //可以调用以下的doFinal()方法完成加密或解密数据: - buff = cipher.doFinal(datas, offSet, maxBlock); - } else { - buff = cipher.doFinal(datas, offSet, datas.length - offSet); - } - out.write(buff, 0, buff.length); - i++; - offSet = i * maxBlock; + int maxBlock = opmode == Cipher.DECRYPT_MODE ? keySize / 8 : keySize / 8 - 11; + int offset = 0; + int index = 0; + + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + while (datas.length > offset) { + int inputLen = Math.min(datas.length - offset, maxBlock); + byte[] buffer = cipher.doFinal(datas, offset, inputLen); + out.write(buffer, 0, buffer.length); + index++; + offset = index * maxBlock; } + return out.toByteArray(); } catch (Exception e) { - throw new RuntimeException("加解密阀值为[" + maxBlock + "]的数据时发生异常", e); + throw new RuntimeException("RSA block codec failed, maxBlock=" + maxBlock, e); } - byte[] resultDatas = out.toByteArray(); - IOUtils.closeQuietly(out); - return resultDatas; } - public static void main(String[] args) { - -// Map encryptKey = createEncryptKey(); -// String publicKey = encryptKey.get("publicKey"); -// String privateKey = encryptKey.get("privateKey"); -// -// System.out.println("公匙加密串:" + publicKey); -// System.out.println("私匙加密串:" + privateKey); -// -// System.out.println(); -// - String data = "data"; - //加密 - try { - String s = publicEncrypt(data, getPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC_F5UQC1QWsu3QsESQBz9M-GDA9Atm0qVSvwIsy568lyRLi-nq3VvvnmgrlL4yTbngFzyfb2Dn35cNCHsBvIaGuCY3_PpzPqMzVpxr2QlEkhEX9atnJQ1rWexS8QeZtPjpiIwoQrChTzXjD_sYUkDrqSykFplyivf0NSO2WqCBdwIDAQAB")); - System.out.println("加密后密文:" + s); - - String ss = "bPrP3VQpVNj7jxzSvVRQQpOCzg4c9HAMd/Sesda0SOxmWbNzP8SnhayV2H9Jpih2sf26O8dOqiNE7V1u5NPgQBIPi6LqX2QiFTjynVLxQBUmISfmQ2Q6K3sjHBIRIhuZPrXijw7CextUUQwzh4VvEVkjyaUnqlMXVRkUGlgqP7M="; - String privateKey1 = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBALiJJ6RPMMh-ETrmppOG7JKINPSFaaZoHjzZkyQl3AcfrpKMmH82j_Pxl4mPvvgKtbR20N-88-nJLT4v4aOz9XYVl5ruE59SsJl_T8YqN-i8L8KH8Wptd0_ee7nDhF4-OGEi-o330daFv20eLpboy6nDkWLmLihKC0jEZWK8MLZzAgMBAAECgYAEhO9gmcPjFRtM6vsnX8WJbSaG2oGU3rXm3Zk56Gd0ETWQRzsw2mA6JC-G4etWXcTHb6V75T-_-PpPrJKFFNItEH-WFRS36xneomycxRG1YTfK1SsGLGF0BV3bLVZx8cQz7VsBY4vqbRCSKtcOZBJpnxI6iHAv07i8w34F6qjfsQJBAORnKUuJQ_GsHHBPT1VhMYjXVepAfTrWtCzRQ648KavbHLAGaRIhX10uj-hAhZLafDqQF8Y7T7GHTlasRL9ubWsCQQDO1R3KScJJSR3KDsnSsF0YCw7V28cr_OVAwiPoro90Me6MUz9yKV88gQlTuJkNFMuu_YdPXYKjlzNVg0zFmtUZAkEAoe9mPtDeZD0TmKkSZUVYul1543C_mPTan5_qrWCoZtkd2MtiuWEB3O4DR7ZfPcQ8KcU5pektUn_NEfRndZYUawJBAJfydOoxeawBLQNODfLcYefR59owlYe5SGpktaCw7O596DPqzId_4Vk_qqx4xueXSXOLCabCmcC4yZue0_2vm7ECQQDLrzXL-BpSqxbvtE0gNKcgaSkEUSOh1QmQFPCHERsOBxcflM6ej71STKglB21JD9m6tM2RySgbtUx4TfOuJTek"; - String s1 = privateDecryption(ss, getPrivateKey(privateKey1)); - System.out.println("解密后明文:" + s1); - - } catch (Exception e) { - throw new IllegalArgumentException(); - } + public static void main(String[] args) throws Exception { + Map encryptKey = createEncryptKey(); + String publicKey = encryptKey.get("publicKey"); + String privateKey = encryptKey.get("privateKey"); + String data = "{\"account\":\"admin\",\"pwd\":\"123456\"}"; + String encrypted = publicEncrypt(data, getPublicKey(publicKey)); + String decrypted = privateDecryption(encrypted, getPrivateKey(privateKey)); + System.out.println("publicKey: " + publicKey); + System.out.println("privateKey: " + privateKey); + System.out.println("encrypted: " + encrypted); + System.out.println("decrypted: " + decrypted); } -} \ No newline at end of file +} diff --git a/src/main/java/cn/xf/basedemo/service/impl/UserServiceImpl.java b/src/main/java/cn/xf/basedemo/service/impl/UserServiceImpl.java index a736644..fd929be 100644 --- a/src/main/java/cn/xf/basedemo/service/impl/UserServiceImpl.java +++ b/src/main/java/cn/xf/basedemo/service/impl/UserServiceImpl.java @@ -17,7 +17,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -47,8 +46,6 @@ public class UserServiceImpl implements UserService { @Autowired private RedisTemplate redisTemplate; - private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); - @Override public RetObj login(LoginInfoRes res) { @@ -75,7 +72,7 @@ public class UserServiceImpl implements UserService { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("account", loginInfo.getAccount()); User user = userMapper.selectOne(queryWrapper); - if (Objects.isNull(user) || !passwordEncoder.matches(loginInfo.getPwd(), user.getPassword())) { + if (Objects.isNull(user) || !loginInfo.getPwd().equals(user.getPassword())) { return RetObj.error("账号或密码错误"); } LoginUser loginUser = new LoginUser(); diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html index 9f2dd6a..016b163 100644 --- a/src/main/resources/templates/login.html +++ b/src/main/resources/templates/login.html @@ -1,47 +1,41 @@ - + 模拟登录 - - + #div1 { + width: 200px; + } + + - - - - - -
- + 登录
-
+ diff --git a/src/main/resources/templates/success.html b/src/main/resources/templates/success.html index 859ebf4..354658e 100644 --- a/src/main/resources/templates/success.html +++ b/src/main/resources/templates/success.html @@ -1,46 +1,33 @@ - + - - 登录成功 -
-

欢迎 {{name}} 登录成功~~

+

欢迎 登录成功~~

token: - {{token}} +

- - \ No newline at end of file + +