文章目录
- 一、需求提出
- 二、应用场景
- 三、解决思路
- 四、注意事项
- 五、完整代码
-
- 第一步:前端对密码进行加密
- 第二步:后端工具类实现 RSA 加解密功能
- 第三步:登录接口中添加解密逻辑
- 六、运行结果
- 总结
一、需求提出
在默认情况下,RuoYi 微服务框架的登录接口会通过明文传输密码,这可能导致安全性问题。如果项目对数据传输安全性有较高要求,可以通过配置加密传输方式来提升安全性。本文介绍一种基于 RSA 的解决方案。
二、应用场景
- 增强登录安全性:在密码传输过程中,防止数据被拦截导致的安全泄露。
- 符合安全合规要求:满足企业内部或行业标准对密码保护的要求。
- 敏感信息保护:保护用户的密码等敏感信息在网络传输过程中的隐私。
三、解决思路
- 前端加密:登录表单提交前,利用公钥对用户输入的密码进行加密。
- 后端解密:后端接收加密后的密码,利用私钥解密后继续进行用户身份验证。
- 统一加密工具:通过工具类封装加密和解密操作,便于维护和复用。
四、注意事项
- 公私钥生成:确保公钥和私钥的安全存储,避免密钥泄露。
- 加解密性能:RSA 加密存在一定性能消耗,建议合理优化前后端的加解密流程。
- 版本兼容性:确保前后端加密算法和密钥匹配,避免因版本问题导致数据解析失败。
五、完整代码
第一步:前端对密码进行加密
在前端项目的 login.js 文件中,修改登录方法,利用 RSA 公钥对密码加密。
// 导入加密工具
import { encrypt } from '@/utils/jsencrypt'
// 登录方法
export function login(username, password, code, uuid) {
// 使用公钥对密码加密
password = encrypt(password);
return request({
url: '/auth/login',
method: 'post',
data: { username, password, code, uuid }
});
}
说明:
- encrypt 方法需基于前端封装的 RSA 加密工具,使用后端提供的公钥进行加密。
- 前端仅需发送加密后的密码,后端会负责解密。
第二步:后端工具类实现 RSA 加解密功能
在后端 common 模块的 sign 包下新增工具类 RsaUtils.java,用于封装 RSA 加密解密逻辑。
package com.ruoyi.common.core.utils.sign;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
/**
* RSA 加密解密工具类
*
* @author ruoyi
*/
public class RsaUtils {
// RSA 私钥(用于解密)
public static final String PRIVATE_KEY = "MIIBVAIBADANBgkqhki...";
/**
* 使用私钥解密数据
*
* @param encryptedText 加密的文本
* @return 解密后的文本
* @throws Exception 解密失败抛出异常
*/
public static String decryptByPrivateKey(String encryptedText) throws Exception {
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(PRIVATE_KEY));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedData = cipher.doFinal(Base64.decodeBase64(encryptedText));
return new String(decryptedData);
}
}
说明:
- 私钥安全性:务必妥善保管私钥,避免泄露。
- 加解密算法:工具类使用 RSA 算法,确保与前端加密逻辑一致。
第三步:登录接口中添加解密逻辑
修改 TokenController.java 的登录接口,添加对接收密码的解密操作。
@PostMapping("/login")
public R<?> login(@RequestBody LoginBody form) throws Exception {
// 使用私钥解密密码
String decryptedPassword = RsaUtils.decryptByPrivateKey(form.getPassword());
// 验证用户登录
LoginUser userInfo = sysLoginService.login(form.getUsername(), decryptedPassword);
// 生成并返回 Token
return R.ok(tokenService.createToken(userInfo));
}
说明:
- 解密后的明文密码传递给登录服务进行验证,逻辑与未加密传输时一致。
六、运行结果
- 用户访问登录页面,输入用户名和密码后,点击提交:
-
- 前端会对输入的密码进行 RSA 加密,后端接收到加密后的数据。
- 后端解密成功后,验证用户名和密码的有效性:
-
- 登录成功返回 Token,用户进入系统主页。
总结
通过前端加密与后端解密的配合,可以有效提升登录接口的安全性,避免密码明文传输可能带来的风险。这种方式简单实用,适用于需要保护用户敏感数据的场景。