在若依(uoYi
)系统中集成JSEncrypt
,实现密码加密传输,增强登录安全性。用户在前端输入密码后,通过RSA
加密传输到后端,后端再进行解密和验证。
RSA加密是一种非对称加密算法,具有以下特点:
– 非对称性:使用一对密钥(公钥和私钥)进行加密和解密。
– 高安全性:适用于需要高安全性的数据传输。
– 公开密钥:公钥可以公开而不会影响安全性,私钥必须保密。
JSEncrypt是一个用于JavaScript
的RSA
加密库,能够方便地在前端进行RSA
加密。
JSEncrypt
对密码进行加密。RSA
工具类对加密后的密码进行解密。ruoyi-admin
├── src\main\java
│ │ └── com\ruoyi\web
│ │ └── controller\system
│ │ └── SysLoginController.java
ruoyi-common
├── src\main\java
│ │ └── com\ruoyi\common
│ │ └── utils\sign
│ │ └── RsaUtils.java
ruoyi-framework
├── src\main\java
│ │ └── com\ruoyi\framework
│ │ └── shiro\service
│ │ └── SysLoginService.java
ruoyi-ui
├── src
│ ├── utils
│ │ └── jsencrypt.js
│ ├── views
│ │ └── login
│ │ └── index.vue
RSA
密钥对一致。JSEncrypt
库版本与项目兼容。第一步:引入JSEncrypt库
在ruoyi-ui/src/utils/jsencrypt.js
中引入JSEncrypt并编写加密方法:
import JSEncrypt from 'jsencrypt/bin/jsencrypt.min'
export function encrypt(text) {
const publicKey = 'YOUR_PUBLIC_KEY_HERE';
const encryptor = new JSEncrypt();
encryptor.setPublicKey(publicKey);
return encryptor.encrypt(text);
}
第二步:修改登录方法
在ruoyi-ui/src/views/login/index.vue
中修改登录方法,对密码进行RSA加密:
import { encrypt } from '@/utils/jsencrypt'
export function login(username, password, code, uuid) {
password = encrypt(password);
.........
}
第一步:创建RsaUtils工具类
在ruoyi-common/src/main/java/com/ruoyi/common/utils/sign/RsaUtils.java
中创建RsaUtils工具类,用于RSA加密解密:
package com.ruoyi.common.utils.sign;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
public class RsaUtils {
// Rsa 私钥
public static String privateKey = "YOUR_PRIVATE_KEY_HERE";
public static String decryptByPrivateKey(String text) throws Exception {
return decryptByPrivateKey(privateKey, text);
}
public static String decryptByPrivateKey(String privateKeyString, String text) throws Exception {
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] result = cipher.doFinal(Base64.decodeBase64(text));
return new String(result);
}
public static String encryptByPublicKey(String publicKeyString, String text) throws Exception {
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] result = cipher.doFinal(text.getBytes());
return Base64.encodeBase64String(result);
}
}
第一步:修改登录方法
在SysLoginService.java
中对密码进行RSA解密:
import com.ruoyi.common.utils.sign.RsaUtils;
public SysUser login(String username, String password) throws Exception {
// 关键代码 RsaUtils.decryptByPrivateKey(password)
String decryptedPassword = RsaUtils.decryptByPrivateKey(password);
UsernamePasswordToken token = new UsernamePasswordToken(username, decryptedPassword, false);
Subject subject = SecurityUtils.getSubject();
try {
subject.login(token);
return AjaxResult.success("登录成功");
} catch (AuthenticationException e) {
return AjaxResult.error("登录名称或密码错误");
}
}
在浏览器中打开登录页面,输入用户名和密码,点击登录按钮。
查看后端日志,确认接收到的密码是经过解密后的明文密码。
通过上述配置和代码修改,用户在前端输入密码后,密码会通过RSA加密传输到后端,后端再进行解密和验证,确保密码在传输过程中的安全性。登录成功后返回相应的成功信息,登录失败则返回错误信息。
powered by kaifamiao