• 前后端传输加密代码-java


    介绍

    以下代码均使用RSA加密,适用场景:注册、登录时的密码加密、敏感信息加密等

    业务流程:

    1. 后端使用RSA算法生成一套密钥
    2. 前端使用接口获取后端公钥
    3. 后端将公钥传给前端,私钥留在本地服务器
    4. 前端使用公钥对明文加密,传输到后端
    5. 后端使用私钥解密,将密文转为明文

    后端

    秘钥类

    package com.zq.drawingBed.bo;
    
    import lombok.Data;
    import lombok.experimental.Accessors;
    
    @Data
    @Accessors(chain = true)
    public class SecretKeyBo {
        private String publicKey;
        private String privateKey;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    秘钥工具类

    package com.zq.drawingBed.utils;
    
    import com.zq.drawingBed.bo.SecretKeyBo;
    import com.zq.drawingBed.config.SecretKeySchedule;
    
    
    import java.io.IOException;
    import java.nio.charset.StandardCharsets;
    import java.security.*;
    import java.util.Base64;
    import javax.crypto.Cipher;
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.PKCS8EncodedKeySpec;
    import java.security.spec.X509EncodedKeySpec;
    
    public class RsaUtil {
    
        /**
         * 密钥长度 于原文长度对应 以及越长速度越慢
         */
        private final static int KEY_SIZE = 512;
    
    
        /**
         * 随机生成的一套密钥对
         */
        public SecretKeyBo genKeyPair() throws NoSuchAlgorithmException, IOException {
            // KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
            // 初始化密钥对生成器
            keyPairGen.initialize(KEY_SIZE, new SecureRandom());
            // 生成一个密钥对,保存在keyPair中
            KeyPair keyPair = keyPairGen.generateKeyPair();
            // 得到私钥
            RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
            // 得到公钥
            RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
            String publicKeyString = Base64.getEncoder().encodeToString(publicKey.getEncoded());
            // 得到私钥字符串
            String privateKeyString = Base64.getEncoder().encodeToString(privateKey.getEncoded());
    
            return new SecretKeyBo()
                    .setPrivateKey(privateKeyString)
                    .setPublicKey(publicKeyString);
        }
    
        /**
         * RSA公钥加密
         *
         * @param str    加密字符串
         * @param publicKey 公钥
         * @return 密文
         * @throws Exception 加密过程中的异常信息
         */
        public  String encrypt(String str, String publicKey) throws Exception {
            //base64编码的公钥
            byte[] decoded = Base64.getDecoder().decode(publicKey);
            RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
            //RSA加密
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, pubKey);
            return Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes(StandardCharsets.UTF_8)));
        }
    
        /**
         * RSA私钥解密
         *
         * @param str    加密字符串
         * @param privateKey 私钥
         * @return 明文字符串
         * @throws Exception 解密过程中的异常信息
         */
        public  String decrypt(String str, String privateKey) throws Exception {
            //64位解码加密后的字符串
            byte[] inputByte = Base64.getDecoder().decode(str);
            //base64编码的私钥
            byte[] decoded = Base64.getDecoder().decode(privateKey);
            RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
            //RSA解密
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, priKey);
            return new String(cipher.doFinal(inputByte));
        }
    
    }
    
    
    
    • 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
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88

    前端

    安装插件

    npm install jsencrypt --dep
    
    • 1

    工具类

    src目录下创建utils目录,在utils目录下创建encrypt.js文件,在里面编写加密工具函数

    import { JSEncrypt } from 'jsencrypt'
    
    export function encryptedData (publicKey,password){
        const encryptor = new JSEncrypt()
        encryptor.setPublicKey(publicKey)
        return encryptor.encrypt(password+'')
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    使用

    import {encryptedData} from "./utils/encrypt";
    
    const encryptedPassword = encryptedData(publicKey,password);
    
    • 1
    • 2
    • 3

    传输

    将加密后的密文传到后端,后端使用私钥即可解密

    尾声

    以上代码在我的图床项目中已经使用,可以进去参考一下:

    • https://gitee.com/codewarning/drawing-bed_Vue

    • https://gitee.com/codewarning/drawing-bed_Springboot

  • 相关阅读:
    引入二维码技术,易点易动全员盘点方案助力高效海量资产盘点
    div css网页html成品学生作业包含10个html页面——动漫主题海贼王
    【从零开始学习 SystemVerilog】7.2、SystemVerilog 类—— Class Handles 和 Objects(句柄和对象)
    LeetCode每日一题(920. Number of Music Playlists)
    升级HarmonyOS 4.2,开启健康生活篇章
    Golang Context 详细原理和使用技巧
    微信网站登录功能
    Django 基础教程
    Linux:软件管理器yum&&编辑器vim
    【高保真原型制作】上海道宁为您带来适用于所有数字产品的简单的​交互式原型制作工具——ProtoPie
  • 原文地址:https://blog.csdn.net/qq_16525829/article/details/126791250