42集成 JSEncrypt 实现密码加密传输
# 集成 JSEncrypt 实现密码加密传输
为了提高登录接口的安全性,我们可以将密码从明文传输改为加密传输。通过在前端使用 JSEncrypt 对密码进行加密,并在后端解密,可以有效地保护用户的密码信息。以下是详细的实现步骤。
# 1. 修改前端 login.js
实现密码加密
首先,我们需要在前端对用户输入的密码进行加密处理。使用 JSEncrypt
库对密码进行 RSA 加密。在登录请求之前,使用公钥对密码进行加密,然后将加密后的密码提交给服务器。
修改 login.js
文件中的 login
方法:
import { encrypt } from '@/utils/jsencrypt'
export function login(username, password, code, uuid) {
// 使用 JSEncrypt 对密码进行加密
password = encrypt(password);
// 发送登录请求
return request({
url: '/login',
method: 'post',
data: {
username,
password,
code,
uuid
}
});
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
说明:
encrypt
方法用于对用户输入的密码进行加密,确保传输过程中密码不会被明文传输。
# 2. 添加工具类 RsaUtils.java
实现 RSA 加密解密
在后端,我们需要一个工具类来处理 RSA 加密解密的操作。创建一个 RsaUtils
类,用于对加密后的密码进行解密。
在 ruoyi-common
模块下,新建一个 RsaUtils.java
文件,并添加以下内容:
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;
/**
* RSA加密解密工具类
*
* 用于对密码进行加密和解密操作。
*
* @author ruoyi
*/
public class RsaUtils {
// Rsa 私钥(这里使用了示例私钥,实际使用中请生成自己的密钥对)
public static String privateKey = "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY"
+ "7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKN"
+ "PuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gA"
+ "kM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWow"
+ "cSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99Ecv"
+ "DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh"
+ "YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3"
+ "UP8iWi1Qw0Y=";
/**
* 使用私钥解密数据
*
* @param text 待解密的文本
* @return 解密后的文本
* @throws Exception 解密过程中的异常
*/
public static String decryptByPrivateKey(String text) throws Exception {
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
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);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
说明:
RsaUtils
提供了decryptByPrivateKey
方法,用于解密通过 RSA 加密的密码。- 示例中使用的私钥应替换为您自己的私钥。
# 3. 修改 SysLoginController.java
实现密码解密
在后端登录方法中,使用 RsaUtils
对前端传递过来的加密密码进行解密,然后继续后续的登录逻辑处理。
修改 SysLoginController.java
中的 login
方法:
import com.ruoyi.common.utils.sign.RsaUtils;
@PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody) {
AjaxResult ajax = AjaxResult.success();
// 解密前端传递过来的加密密码
String decryptedPassword = RsaUtils.decryptByPrivateKey(loginBody.getPassword());
// 生成令牌
String token = loginService.login(
loginBody.getUsername(),
decryptedPassword,
loginBody.getCode(),
loginBody.getUuid()
);
ajax.put(Constants.TOKEN, token);
return ajax;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
说明:
RsaUtils.decryptByPrivateKey(loginBody.getPassword())
用于将加密的密码解密为明文密码,然后传递给登录服务处理。
# 4. 验证集成效果
完成上述集成步骤后,您可以通过以下方式验证集成效果:
- 启动前后端服务,访问登录页面。
- 输入用户名和密码,然后在浏览器开发者工具中检查网络请求,确认密码已被加密。
- 在后端控制台或日志中检查解密后的密码是否正确。
# 5. 注意事项
- 密钥管理:RSA 密钥对应妥善管理,特别是私钥应避免泄露。
- 安全配置:在生产环境中,建议使用强密码加密方式和安全通信协议(如 HTTPS)来保护用户数据的传输和存储。
- 前端库:在前端中使用 JSEncrypt 进行 RSA 加密时,请确保引入的库版本稳定可靠,并定期更新以应对安全漏洞。
通过集成 JSEncrypt 和 RSA 加密解密机制,你可以有效提升系统的安全性,防止敏感信息在传输过程中的泄露。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08