程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 若依框架
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 若依框架
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 快速入门

  • 后端手册

  • 前端手册

  • 组件文档

  • 数据库分析

  • 集成插件

    • 集成 Docker 实现一键部署
    • 升级 Spring Boot 到 3.x 版本
    • 集成 Ehcache 实现本地缓存切换
    • 集成 WebSocket 实现实时通信
    • 集成 Electron 实现桌面应用程序
    • 集成 Atomikos 实现分布式事务
    • 集成 MinIO 实现分布式文件存储
    • 集成 Easy-ES 实现分布式全文检索
    • 使用 `localStorage` 代替 `cookie`
    • 使用 Undertow 替代 Tomcat 容器
    • 集成 Actuator 实现优雅关闭应用
    • 集成 AJ-Captcha 实现滑块验证码
    • 集成 Sharding-JDBC 实现分库分表
    • 集成 JustAuth 实现第三方授权登录
    • 集成 `watermark-dom` 实现页面水印
    • 集成 MyBatis-Plus 实现 MyBatis 增强
    • 集成 EasyExcel 实现 Excel 表格增强
    • 集成 Knife4j 实现 Swagger 文档增强
    • 集成 Redisson 实现 Redis 分布式锁
    • 集成 IP2Region 实现离线 IP 地址定位
    • 42集成 JSEncrypt 实现密码加密传输
      • 1. 修改前端 login.js 实现密码加密
      • 2. 添加工具类 RsaUtils.java 实现 RSA 加密解密
      • 3. 修改 SysLoginController.java 实现密码解密
      • 4. 验证集成效果
      • 5. 注意事项
    • 集成 HttpClient 实现 HTTP 接口增强
    • 集成 Druid 实现数据库密码加密功能
    • 集成 Browscap 实现用户代理解析
    • 集成 Dynamic-DataSource 实现多数据源增强
  • 若依框架
  • 集成插件
scholar
2024-08-31
目录

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

说明:

  • 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

说明:

  • 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

说明:

  • RsaUtils.decryptByPrivateKey(loginBody.getPassword()) 用于将加密的密码解密为明文密码,然后传递给登录服务处理。

# 4. 验证集成效果

完成上述集成步骤后,您可以通过以下方式验证集成效果:

  1. 启动前后端服务,访问登录页面。
  2. 输入用户名和密码,然后在浏览器开发者工具中检查网络请求,确认密码已被加密。
  3. 在后端控制台或日志中检查解密后的密码是否正确。

# 5. 注意事项

  • 密钥管理:RSA 密钥对应妥善管理,特别是私钥应避免泄露。
  • 安全配置:在生产环境中,建议使用强密码加密方式和安全通信协议(如 HTTPS)来保护用户数据的传输和存储。
  • 前端库:在前端中使用 JSEncrypt 进行 RSA 加密时,请确保引入的库版本稳定可靠,并定期更新以应对安全漏洞。

通过集成 JSEncrypt 和 RSA 加密解密机制,你可以有效提升系统的安全性,防止敏感信息在传输过程中的泄露。

编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08
集成 IP2Region 实现离线 IP 地址定位
集成 HttpClient 实现 HTTP 接口增强

← 集成 IP2Region 实现离线 IP 地址定位 集成 HttpClient 实现 HTTP 接口增强→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式