前端 vue 实现加密 hutool 工具包实现 rsa 解密

文章目录

  • 背景
  • 一、后端-准备
    • 1.RsaUtils
    • 2.controller
  • 二、前端 vue
  • 三、后端-登录方法
  • 一些疑问


背景

系统登录处经过安全扫描存在漏洞,如图
前端 vue 实现加密 hutool 工具包实现 rsa 解密_第1张图片
前端 vue 实现加密 hutool 工具包实现 rsa 解密_第2张图片

图文彻底搞懂非对称加密(公钥密钥)


一、后端-准备

1.RsaUtils



import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;

import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

/**
 * @author: LZH
 * @date 2023/4/20 16:20
 */

public class RsaUtils {

    public static final String ENCRYPT_TYPE = "RSA";


    /**
     * 公钥
     */
    public static final String PUBLIC_KEY = "待生成,生成后替换我";

    /**
     * 私钥
     */
    private static final String PRIVATE_KEY = "待生成,生成后替换我";

    public static void main(String[] args) {
        generateKey();
        String content = "loginTest测试";

        String encrypt = RsaUtils.encrypt(content, PUBLIC_KEY);

        String decrypt = RsaUtils.decrypt(encrypt);
        System.out.println(decrypt);

    }

    /**
     * 生成后替换
     */
    public static void generateKey() {

        Map<String, String> stringStringMap = RsaUtils.generateKeyPair();

        String RSAPublicKey = stringStringMap.get("PUBLIC_KEY");

        String RSAPrivateKey = stringStringMap.get("PRIVATE_KEY");
        System.out.println(RSAPublicKey);
        System.out.println("************************");
        System.out.println(RSAPrivateKey);

    }

    public static Map<String, String> generateKeyPair() {
        try {
            KeyPair pair = SecureUtil.generateKeyPair(ENCRYPT_TYPE);
            PrivateKey privateKey = pair.getPrivate();
            PublicKey publicKey = pair.getPublic();
            // 获取 公钥和私钥 的 编码格式(通过该 编码格式 可以反过来 生成公钥和私钥对象)
            byte[] pubEncBytes = publicKey.getEncoded();
            byte[] priEncBytes = privateKey.getEncoded();

            // 把 公钥和私钥 的 编码格式 转换为 Base64文本 方便保存
            String pubEncBase64 = Base64.getEncoder().encodeToString(pubEncBytes);
            String priEncBase64 = Base64.getEncoder().encodeToString(priEncBytes);

            Map<String, String> map = new HashMap<String, String>(2);
            map.put("PUBLIC_KEY", pubEncBase64);
            map.put("PRIVATE_KEY", priEncBase64);

            return map;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 公钥加密
     *
     * @param content   要加密的内容
     * @param publicKey 公钥
     */
    public static String encrypt(String content, String publicKey) {
        try {
            RSA rsa = new RSA(null, publicKey);
            return rsa.encryptBase64(content, KeyType.PublicKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 私钥解密
     *
     * @param content 要解密的内容
     */
    public static String decrypt(String content) {
        try {
            RSA rsa = new RSA(PRIVATE_KEY, null);
            return rsa.decryptStr(content, KeyType.PrivateKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
 

2.controller

	@GetMapping(value = "/getPublicKey")
	public String getPublicKey() {
		return RsaUtils.PUBLIC_KEY;
	}

二、前端 vue

前端 vue 实现加密 hutool 工具包实现 rsa 解密_第3张图片


import JSEncrypt from 'jsencrypt'


methods: {
	login2(that,loginParams) {
      //校验参数。。。
      
      const encrypt = new JSEncrypt()
      that.getPublicKey(function (publicKey) {
        encrypt.setPublicKey(publicKey)
        let data = encrypt.encrypt(JSON.stringify(loginParams));
        that.Login({data: data}).then((res) => {
          that.loginCallback(res)
          // this.departConfirm(res)
        }).catch((err) => {
          that.requestFailed(err);
        });
      });
    },

    getPublicKey(callable){
      getAction(this.url.getPublicKey).then((res) => {
        if (res.success) {
          callable(res.message)
        } else {
          this.$message.warning("获取公钥失败,请联系管理员")
        }
      });
    },
}

三、后端-登录方法

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public String login(@RequestBody Map<String,String> map) {
        SysLoginModel sysLoginModel;
        sysLoginModel = JSONObject.parseObject(RsaUtils.decrypt(map.get("data")), SysLoginModel.class);
      
        return "ok";
    }

一些疑问

前端 vue 实现加密 hutool 工具包实现 rsa 解密_第4张图片


前端 vue 实现加密 hutool 工具包实现 rsa 解密_第5张图片

你可能感兴趣的:(前端,vue.js,java)