开发喵星球

若依集成jsencrypt实现密码加密传输方式(251)

需求提出

在若依(uoYi)系统中集成JSEncrypt,实现密码加密传输,增强登录安全性。用户在前端输入密码后,通过RSA加密传输到后端,后端再进行解密和验证。

相关介绍

RSA加密是一种非对称加密算法,具有以下特点:
非对称性:使用一对密钥(公钥和私钥)进行加密和解密。
高安全性:适用于需要高安全性的数据传输。
公开密钥:公钥可以公开而不会影响安全性,私钥必须保密。

JSEncrypt是一个用于JavaScriptRSA加密库,能够方便地在前端进行RSA加密。

解决思路

  1. 前端加密:在前端使用JSEncrypt对密码进行加密。
  2. 后端解密:在后端使用RSA工具类对加密后的密码进行解密。
  3. 登录验证:使用解密后的密码进行登录验证。

所需技术

项目结构树

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

注意事项

完整代码

一、前端加密方法

第一步:引入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);
  .........
}

二、Rsa加密工具类

第一步:创建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("登录名称或密码错误");
    }
}

接口功能测试

  1. 前端测试

在浏览器中打开登录页面,输入用户名和密码,点击登录按钮。

  1. 后端测试

查看后端日志,确认接收到的密码是经过解密后的明文密码。

运行结果

通过上述配置和代码修改,用户在前端输入密码后,密码会通过RSA加密传输到后端,后端再进行解密和验证,确保密码在传输过程中的安全性。登录成功后返回相应的成功信息,登录失败则返回错误信息。

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-06-24 17:41:13 阅读量:345
<<   >>


powered by kaifamiao