国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot+Vue 后端輸出加密,前端請(qǐng)求統(tǒng)一解密

這篇具有很好參考價(jià)值的文章主要介紹了SpringBoot+Vue 后端輸出加密,前端請(qǐng)求統(tǒng)一解密。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

針對(duì)客戶對(duì)數(shù)據(jù)交互過(guò)程中的加密要求,防止直接的數(shù)據(jù)爬取,對(duì)前后端數(shù)據(jù)請(qǐng)求時(shí)的返回?cái)?shù)據(jù)進(jìn)行數(shù)據(jù)的加密。實(shí)用性嘛,也就那樣了,代碼可直接適配Ruoyi SpringBoot+vue項(xiàng)目,具體加密方式和處理僅供參考!

前端

request.js

import axios from 'axios'
import { Notification, MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode'

import DES from './des'

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 創(chuàng)建axios實(shí)例
const service = axios.create({
  // axios中請(qǐng)求配置有baseURL選項(xiàng),表示請(qǐng)求URL公共部分
  baseURL: process.env.VUE_APP_BASE_API,
  // 超時(shí)
  timeout: 10000
})
// request攔截器
service.interceptors.request.use(config => {
  // console.log(config);
  // 是否需要設(shè)置 token
  const isToken = (config.headers || {}).isToken === false
  if (getToken() && !isToken) {
    config.headers['Authorization'] = 'Bearer ' + getToken() // 讓每個(gè)請(qǐng)求攜帶自定義token 請(qǐng)根據(jù)實(shí)際情況自行修改
  }
  // get請(qǐng)求映射params參數(shù)
  if (config.method === 'get' && config.params) {
    let url = config.url + '?';
    for (const propName of Object.keys(config.params)) {
      const value = config.params[propName];
      var part = encodeURIComponent(propName) + "=";
      if (value !== null && typeof (value) !== "undefined") {
        if (typeof value === 'object') {
          for (const key of Object.keys(value)) {
            if (value[key] !== null && typeof (value[key]) !== 'undefined') {
              let params = propName + '[' + key + ']';
              let subPart = encodeURIComponent(params) + '=';
              url += subPart + encodeURIComponent(value[key]) + '&';
            }
          }
        } else {
          url += part + encodeURIComponent(value) + "&";
        }
      }
    }
    url = url.slice(0, -1);
    config.params = {};
    config.url = url;
  }
  return config
}, error => {
  console.log(error)
  Promise.reject(error)
})

// 響應(yīng)攔截器
service.interceptors.response.use(res => {
    // 未設(shè)置狀態(tài)碼則默認(rèn)成功狀態(tài)
    const code = res.data.code || 200;
    // 獲取錯(cuò)誤信息
    const msg = errorCode[code] || res.data.msg || errorCode['default']
    if (code === 401) {
      MessageBox.confirm('登錄狀態(tài)已過(guò)期,您可以繼續(xù)留在該頁(yè)面,或者重新登錄', '系統(tǒng)提示', {
          confirmButtonText: '重新登錄',
          cancelButtonText: '取消',
          type: 'warning'
        }
      ).then(() => {
        store.dispatch('LogOut').then(() => {
          location.href = '/index';
        })
      }).catch(() => { });
      return Promise.reject('無(wú)效的會(huì)話,或者會(huì)話已過(guò)期,請(qǐng)重新登錄。')
    } else if (code === 500) {
      Message({
        message: msg,
        type: 'error'
      })
      return Promise.reject(new Error(msg))
    } else if (code !== 200) {
      Notification.error({
        title: msg
      })
      return Promise.reject('error')
    } else {

      console.log(res.data);

      // DES解密
      if (res.data.result) {
        let decrypt = DES.decryptECB(res.data.result, '947dcfd3-1163-4ad7-b0f9-b68a78434406')
        if(res.data.hasOwnProperty("rows")){
          res.data.rows = JSON.parse(decrypt)
        }else{
          res.data.data = JSON.parse(decrypt)
        }
        delete res.data['result']
      }

      return res.data
    }
  },
  error => {
    console.log('err' + error)
    let { message } = error;
    if (message == "Network Error") {
      message = "后端接口連接異常";
    }
    else if (message.includes("timeout")) {
      message = "系統(tǒng)接口請(qǐng)求超時(shí)";
    }
    else if (message.includes("Request failed with status code")) {
      message = "系統(tǒng)接口" + message.substr(message.length - 3) + "異常";
    }
    Message({
      message: message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service

des.js

import CryptoJS from 'crypto-js'

export default {
    // 加密
    encryptECB(text, textKey) {
        //把私鑰轉(zhuǎn)換成16進(jìn)制的字符串
        var key = CryptoJS.enc.Utf8.parse(textKey);
        //模式為ECB padding為Pkcs7
        var encrypted = CryptoJS.DES.encrypt(text, key, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });
        //加密出來(lái)是一個(gè)16進(jìn)制的字符串
        return encrypted.ciphertext.toString();

    },

    // 解密
    decryptECB(ciphertext, textKey) {
        //把私鑰轉(zhuǎn)換成16進(jìn)制的字符串
        var key = CryptoJS.enc.Utf8.parse(textKey);
        console.log(123, key);
        // console.log(CryptoJS.enc.Utf8.stringify(key));
        //把需要解密的數(shù)據(jù)從16進(jìn)制字符串轉(zhuǎn)換成字符byte數(shù)組
        var decrypted = CryptoJS.DES.decrypt({
            ciphertext: CryptoJS.enc.Hex.parse(ciphertext)
        }, key, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });
        //以u(píng)tf-8的形式輸出解密過(guò)后內(nèi)容
        return decrypted.toString(CryptoJS.enc.Utf8);
    }
}

后端java文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-697983.html

package com.silen.framework.aspect;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 只有使用了該注解的方法才需要執(zhí)行AES解密
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DESDecrypt { }
package com.silen.framework.aspect;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.silen.common.config.SilenConfig;
import com.silen.common.core.domain.AjaxResult;
import com.silen.common.core.page.TableDataInfo;
import com.silen.framework.aspect.utils.Constant;
import com.silen.framework.aspect.utils.DESUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Controller AES加密:針對(duì)所有請(qǐng)求的返回結(jié)果進(jìn)行加密
 */
@Aspect
@Order(2)
@Component
public class DESEncryptAspect {

    @Pointcut("execution(* com.silen.*.controller..*.*(..))")
    public void pointcut() {}

    @Around("pointcut()")
    @SuppressWarnings("unchecked")
    public Object decrypt(ProceedingJoinPoint point) throws Throwable {
        // 獲取到控制器返回結(jié)果
        Object proceed = point.proceed(point.getArgs());
        if(proceed instanceof AjaxResult){
            AjaxResult r = (AjaxResult) proceed;
            // 如果包含結(jié)果集,將結(jié)果集進(jìn)行加密后返回
            if (r.containsKey("data")) {
                Object json = r.get("data");
                String encrypt = DESUtil.encode(Constant.DES_KEY,JSON.toJSONString(json));
                //String encrypt = AESUtil.AESEncrypt(JSON.toJSONString(json));
                r.remove("data");
                r.put(Constant.SUCCESS_NAME, encrypt);
            }
            return r;
        }else if(proceed instanceof TableDataInfo){
            TableDataInfo r =(TableDataInfo)proceed;
                List<?> rows = r.getRows();
            String encrypt = DESUtil.encode(Constant.DES_KEY, JSON.toJSONString(rows));
            r.setRows(new ArrayList<>());
            r.setResult(encrypt);
            return r;
        }
        return proceed;
    }

}
package com.silen.framework.aspect;

import com.alibaba.fastjson.JSON;
import com.silen.framework.aspect.exception.DESException;
import com.silen.framework.aspect.exception.TypeConverterException;
import com.silen.framework.aspect.utils.Constant;
import com.silen.framework.aspect.utils.DESUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.HashMap;

/**
 * Controller AES解密:GET、DELETE請(qǐng)求
 *    由于AESOtherDecryptAspect實(shí)現(xiàn)的RequestBodyAdvice只針對(duì)擁有請(qǐng)求體的HTTP請(qǐng)求生效
 *    而GET、DELETE請(qǐng)求不包含請(qǐng)求體,所以這里單獨(dú)使用AOP進(jìn)行解密
 */
@Aspect
@Order(1)
@Component
public class DESGetDeleteDecryptAspect {

    // 切入點(diǎn):只有使用了@DESDecrypt注解的GET請(qǐng)求才會(huì)執(zhí)行解密
    @Pointcut("@annotation(com.silen.framework.aspect.DESDecrypt) && " +
            "(@annotation(org.springframework.web.bind.annotation.GetMapping) || @annotation(org.springframework.web.bind.annotation.DeleteMapping)) && " +
            "execution(* com.silen.*.controller..*.*(..))")
    public void pointcut() { }

    @Around("pointcut()")
    public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
        // 獲取到請(qǐng)求的參數(shù)列表進(jìn)行解密
        Object[] args = joinPoint.getArgs();
        this.decrypt(args);
        // 執(zhí)行將解密的結(jié)果交給控制器進(jìn)行處理,并返回處理結(jié)果
        return joinPoint.proceed(args);
    }

    // 解密方法
    @SuppressWarnings("unchecked")
    public void decrypt(Object[] args) throws DESException, TypeConverterException {
        // 獲取請(qǐng)求參數(shù)并轉(zhuǎn)換為字符串(密文)
        HashMap<String, Object> data = (HashMap<String, Object>) args[0];
        String encrypt = data.get("json").toString();
        // 將密文解密為JSON字符串
        String json = DESUtil.decode(Constant.DES_KEY,encrypt);
        // 將JSON字符串轉(zhuǎn)換為Map集合,并替換原本的參數(shù)
        args[0] = JSON.parse(json);
    }

}
package com.silen.framework.aspect;

import com.alibaba.fastjson.JSON;
import com.silen.framework.aspect.utils.Constant;
import com.silen.framework.aspect.utils.DESUtil;
import org.apache.commons.io.IOUtils;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Type;
import java.util.HashMap;

/**
 * Controller AES解密:POST、PUT請(qǐng)求
 *    1. 使用@ControllerAdvice注解掃描Controller所在位置
 *    2. 實(shí)現(xiàn)RequestBodyAdvice接口來(lái)處理參數(shù)
 *
 *    經(jīng)測(cè)試:RequestBodyAdvice執(zhí)行優(yōu)先級(jí)高于AOP
 */
@ControllerAdvice("com.silen.*.controller")
public class DESPostPutDecryptAspect implements RequestBodyAdvice {

    // 判斷當(dāng)前Controller是否需要進(jìn)行參數(shù)解密
    @Override
    public boolean supports(MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
        // 只有標(biāo)識(shí)了@DESDecrypt注解的控制器才需要解密
        return methodParameter.hasMethodAnnotation(DESDecrypt.class);
    }

    @Override
    public HttpInputMessage beforeBodyRead(HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) throws IOException {
        return new HttpInputMessage() {
            @Override
            public InputStream getBody() throws IOException {
                String json = null;
                try {
                    InputStream body = httpInputMessage.getBody();
                    HashMap<String, Object> map = (HashMap<String, Object>) JSON.parse(IOUtils.toString(body));
                    String encrypt = map.get("json").toString();
                     json = DESUtil.decode(Constant.DES_KEY,encrypt);
                } catch (Exception e) {
                    // TODO 異常處理待考究
                }
                return IOUtils.toInputStream(json);
            }
            @Override
            public HttpHeaders getHeaders() {
                return httpInputMessage.getHeaders();
            }
        };
    }

    @Override
    public Object afterBodyRead(Object o, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
        return o;
    }

    @Override
    public Object handleEmptyBody(Object o, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass) {
        return o;
    }

}
package com.silen.framework.aspect.exception;

/**
 * AES數(shù)據(jù)加密解密異常
 */
public class DESException extends Exception {

    public DESException(String msg) {
        super(msg);
    }

}
package com.silen.framework.aspect.exception;

/**
 * 類型轉(zhuǎn)換異常
 */
public class TypeConverterException extends Exception{

    public TypeConverterException(String msg) {
        super(msg);
    }

}
package com.silen.framework.aspect.utils;

import javax.crypto.Cipher;
import java.security.Key;

/**
 * 加密協(xié)議工具
 */
public class DESUtil {

    private static String strDefaultKey = "mykey";
    private Cipher encryptCipher = null;
    private Cipher decryptCipher = null;

    public static String byteArr2HexStr(byte[] arrB) throws Exception {
        int iLen = arrB.length;
        StringBuffer sb = new StringBuffer(iLen * 2);
        for (int i = 0; i < iLen; i++) {
            int intTmp = arrB[i];
            while (intTmp < 0) {
                intTmp = intTmp + 256;
            }
            if (intTmp < 16) {
                sb.append("0");
            }
            sb.append(Integer.toString(intTmp, 16));
        }
        return sb.toString();
    }

    public static byte[] hexStr2ByteArr(String strIn) throws Exception {
        byte[] arrB = strIn.getBytes();
        int iLen = arrB.length;

        byte[] arrOut = new byte[iLen / 2];
        for (int i = 0; i < iLen; i = i + 2) {
            String strTmp = new String(arrB, i, 2);
            arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
        }
        return arrOut;
    }

    public DESUtil() throws Exception {
        this(strDefaultKey);
    }

    public DESUtil(String strKey) throws Exception {
        if (strKey == null)
            return;
        java.security.Security.addProvider(new com.sun.crypto.provider.SunJCE());
        Key key = getKey(strKey.getBytes());
        encryptCipher = Cipher.getInstance("DES");
        encryptCipher.init(Cipher.ENCRYPT_MODE, key);

        decryptCipher = Cipher.getInstance("DES");
        decryptCipher.init(Cipher.DECRYPT_MODE, key);
    }

    public void renderKey(String strKey) throws Exception {
        if (strKey == null)
            return;
        java.security.Security.addProvider(new com.sun.crypto.provider.SunJCE());
        Key key = getKey(strKey.getBytes());
        encryptCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        encryptCipher.init(Cipher.ENCRYPT_MODE, key);

        decryptCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        decryptCipher.init(Cipher.DECRYPT_MODE, key);
    }

    public byte[] encrypt(byte[] arrB) throws Exception {
        return encryptCipher.doFinal(arrB);
    }

    public String encrypt(String strIn) throws Exception {
        return byteArr2HexStr(encrypt(strIn.getBytes()));
    }


    public byte[] decrypt(byte[] arrB) throws Exception {
        return decryptCipher.doFinal(arrB);
    }

    public String decrypt(String strIn) throws Exception {
        return new String(decrypt(hexStr2ByteArr(strIn)));
    }


    private Key getKey(byte[] arrBTmp) throws Exception {
        byte[] arrB = new byte[8];

        for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
            arrB[i] = arrBTmp[i];
        }

        Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");

        return key;
    }


    /**
     * 加密
     *
     * @param key 密鑰
     * @param str 需要加密的字符串
     * @return
     */
    public static String encode(String key, String str) {
        DESUtil des = null;
        try {
            des = new DESUtil(key);
            return des.encrypt(str);
        } catch (Exception ex) {
        }
        return "";
    }

    public static String decode(String key, String str) {
        DESUtil des = null;
        try {
            des = new DESUtil(key);
            return des.decrypt(str);
        } catch (Exception ex) {
        }
        return "";
    }
    public static String decode(String key, String str,String charset) {
        DESUtil des = null;
        try {
            des = new DESUtil(key);
            return des.decrypt(str,charset);
        } catch (Exception ex) {
        }
        return "";
    }
    public String decrypt(String strIn,String charset) throws Exception {
        return new String(decrypt(hexStr2ByteArr(strIn)),charset);
    }
}

到了這里,關(guān)于SpringBoot+Vue 后端輸出加密,前端請(qǐng)求統(tǒng)一解密的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • java和js實(shí)現(xiàn)前端加密后端解密,后端加密前端解密(Base64)

    目錄 1.前端加密后端解密 2.后端加密前端解密 在前端和后端數(shù)據(jù)傳輸時(shí),常常涉及到隱私數(shù)據(jù)的傳輸(例如用戶名和密碼),這時(shí),我們就需要對(duì)隱私數(shù)據(jù)進(jìn)行加密解密 1.前端加密后端解密 ????????1.1 前端jquery實(shí)現(xiàn) ????????1.2后端 2.后端加密前端解密 ? ? ? ? 2.1后端加密

    2024年02月16日
    瀏覽(30)
  • RSA之前端加密后端解密

    RSA之前端加密后端解密

    RSA加密解密方式有: (1)公鑰加密,私鑰解密; (2)私鑰加密,公鑰解密; 此文章中以下我使用的是 前端公鑰加密,后端私鑰解密 ; http://web.chacuo.net/netrsakeypair 生成對(duì)應(yīng)的公鑰和私鑰 前端加密js文件 : 鏈接: https://pan.baidu.com/s/1NIMayTcmjbMOf7BqPhPQoA 提取碼: t7an 下載js文件并

    2024年02月21日
    瀏覽(31)
  • 使用非對(duì)稱加密(RSA) 實(shí)現(xiàn)前端加密后端解密

    使用非對(duì)稱加密(RSA) 實(shí)現(xiàn)前端加密后端解密

    數(shù)據(jù)加密方式有: 單向加密、對(duì)稱加密、非對(duì)稱加密、加密鹽、散列函數(shù)、數(shù)字簽名。 1、單向加密 單向加密通過(guò)對(duì)數(shù)據(jù)進(jìn)行摘要計(jì)算生成密文,密文不可逆推還原。只能加密,不能解密,常用于提取數(shù)據(jù)的指紋信息以此來(lái)驗(yàn)證數(shù)據(jù)的完整性。但是會(huì)引發(fā)雪崩效應(yīng)(雪崩效應(yīng)

    2024年02月08日
    瀏覽(95)
  • AES對(duì)稱加密實(shí)戰(zhàn)——前端js加密后端python解密

    AES對(duì)稱加密實(shí)戰(zhàn)——前端js加密后端python解密

    高級(jí)加密標(biāo)準(zhǔn)(AES, Advanced Encryption Standard),是一種最常見的對(duì)稱加密算法 。其加密流程如下圖所示,發(fā)送方通過(guò)密鑰對(duì)明文加密后進(jìn)行網(wǎng)絡(luò)傳輸,接收方用同樣的密鑰將密文解密。在前后端通訊場(chǎng)景中,可利用AES算法對(duì)用戶密碼進(jìn)行加密后傳輸,防止被抓包而造成密碼泄露。

    2024年02月04日
    瀏覽(25)
  • 前端AES加密,后端解密,有效防止數(shù)據(jù)外泄

    前端AES加密,后端解密,有效防止數(shù)據(jù)外泄

    在工作中經(jīng)常遇到密碼明文傳輸這個(gè)問(wèn)題,為了讓密碼安全些會(huì)讓加密,現(xiàn)在有個(gè)比較方便的AES加密(前端密鑰可能存在泄露風(fēng)險(xiǎn),應(yīng)該放到配置項(xiàng)中): 一、前端加密 1、首先引入前端需要用到的js:crypto-js,下載地址: CryptoJS-v4.1.1 https://www.aliyundrive.com/s/bXP6M8ZxVAD 點(diǎn)擊鏈接

    2024年02月16日
    瀏覽(22)
  • vue2前端使用axios發(fā)起post請(qǐng)求,后端(springboot)拿不到值解決辦法

    vue2前端使用axios發(fā)起post請(qǐng)求,后端(springboot)拿不到值解決辦法

    axios封裝-我常用的請(qǐng)求頭參數(shù)? application/json; charset=utf-8 頁(yè)面登錄請(qǐng)求-post 網(wǎng)絡(luò)請(qǐng)求正常傳入?yún)?shù) 后端代碼,查看控制臺(tái)發(fā)現(xiàn)都為null,沒取到值。 1.嘗試將前端post請(qǐng)求改成get,其他都不用變 發(fā)現(xiàn)正常取到值,打印輸出正常。前端頁(yè)面正常跳轉(zhuǎn)。 2.后端設(shè)置為post請(qǐng)求,前端a

    2024年02月02日
    瀏覽(22)
  • 三步實(shí)現(xiàn)Java的SM2前端加密后端解密

    三步實(shí)現(xiàn)Java的SM2前端加密后端解密

    秦醫(yī)如毒,無(wú)藥可解。 話不多說(shuō),先上需要用到的 js文件下載鏈接?? 和?? jsp前端代碼 。 第一步: 下載兩個(gè)必備的js文件——? crypto-js.js 、 sm2.js ? 。 它們的下載鏈接如下↓(該網(wǎng)頁(yè)不魔法上網(wǎng)的話會(huì)很卡,畢竟github,建議卡的話就多重新加載幾次,我差不多試了8次才進(jìn)

    2024年02月04日
    瀏覽(89)
  • 使用CryptoJS實(shí)現(xiàn)Vue前端加密,Java后臺(tái)解密的步驟和方法

    1、crypto.js簡(jiǎn)介 ??CryptoJS 是一個(gè) JavaScript 庫(kù),提供了一系列密碼學(xué)函數(shù)和工具,用于加密、解密、生成摘要等任務(wù)。它支持多種加密算法,包括常見的對(duì)稱加密算法(如 AES、DES)和非對(duì)稱加密算法(如 RSA)。 ??同時(shí),CryptoJS還包括了ECB和CBC兩種模式,其中 ECB模式 :全稱

    2024年02月04日
    瀏覽(27)
  • 前端VUE后端JAVA,SM2加解密,一篇解決你的問(wèn)題

    1、后端加密后密文前兩位為“04”,前端解密不了,所以在前端解密時(shí)要把“04”去掉, 2、前端加密后,密文沒有“04”,所以前端加密完要在密文前面加上“04”

    2024年04月23日
    瀏覽(19)
  • springboot + vue 前后端加密傳輸 RSA互相加解密、加簽驗(yàn)簽、密鑰對(duì)生成

    參考 由于Java非對(duì)稱加解密、加驗(yàn)簽都是采用PKCS#8格式的密鑰,PKCS#1格式的密鑰跑不通,這里先簡(jiǎn)單介紹一下兩者的區(qū)別。 PKCS#1和PKCS#8是兩個(gè)不同的數(shù)字證書標(biāo)準(zhǔn)。 PKCS#1是一個(gè)公鑰加密標(biāo)準(zhǔn),它定義了使用RSA算法進(jìn)行加密和簽名的格式。主要用于對(duì)數(shù)字簽名、加密以及數(shù)字簽

    2024年04月27日
    瀏覽(59)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包