使用AES,前端加密,后端解密,spring工具類了

學習python的時候,看到很多會對參數進行加密,于是好奇心驅使下,讓我去了解了下AES加密如何在java中實現。

首先

npm install crypto-js

然后在你的方法中,給你們前端源碼看看,因為我用的ruoyi框架做的實驗,請求可能不是axios發送的請求

<template><div id="app"><div>index2222222</div></div>
</template><script>
import * as echarts from "echarts";
import {listCar} from "@/api/shopcar/car";
import {listSchool, qryName, qryScore} from "@/api/shool/school";
export default {data() {return {// 遮罩層loading: true,// 選中數組ids: [],// 非單個禁用single: true,// 非多個禁用multiple: true,// 顯示搜索條件showSearch: true,// 總條數total: 0,// 【請填寫功能名稱】表格數據carList: [],//測試數組demoList:[],// 彈出層標題title: "",// 是否顯示彈出層open: false,// 查詢參數queryParams: {pageNum: 1,pageSize: 10,spuId: null,spuName: null,skuId: null,skuInfo: null,num: null,tenantId: null,tenantName: null,userId: null,username: null,isSelect: null,addPrice: null,price: null,},// 表單參數form: {},// 表單校驗rules: {}}},created() {},//鉤子函數mounted() {this.qryScore();this.jiami();},methods: {jiami(){// 引入crypto-js庫const CryptoJS = require('crypto-js');
// 定義密鑰const key = CryptoJS.enc.Utf8.parse('1234567890123456'); // 密鑰長度為16字節
// 定義待加密的文件內容const fileContent = 'Hello, World!';
// 加密文件內容const encrypted = CryptoJS.AES.encrypt(fileContent, key, {mode: CryptoJS.mode.ECB, // 加密模式為ECBpadding: CryptoJS.pad.Pkcs7 // 填充方式為Pkcs7});
// 打印加密后的內容console.log('加密后的內容:', encrypted.toString());
// 解密文件內容const decrypted = CryptoJS.AES.decrypt(encrypted, key, {mode: CryptoJS.mode.ECB, // 加密模式為ECBpadding: CryptoJS.pad.Pkcs7 // 填充方式為Pkcs7});
// 打印解密后的內容console.log('解密后的內容:', decrypted.toString(CryptoJS.enc.Utf8));},qryScore() {this.loading = true;qryScore().then(response => {console.log(1234)console.log(response)this.draw(response)});},draw(data) {// 初始化echarts實例let myChart = echarts.init(document.getElementById('myChart'))console.log(this.$echarts)myChart.setOption( {title: {text: 'ECharts 入門示例'},tooltip: {},xAxis: {data: data.name},yAxis: {},series: [{name: '銷量',type: 'bar',data: data.grade}]});}}
}
</script><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;
}
</style>

實現結果

主要代碼

// 引入crypto-js庫
const CryptoJS = require('crypto-js');// 定義密鑰
const key = CryptoJS.enc.Utf8.parse('1234567890123456'); // 密鑰長度為16字節// 定義待加密的文件內容
const fileContent = 'Hello, World!';// 加密文件內容
const encrypted = CryptoJS.AES.encrypt(fileContent, key, {mode: CryptoJS.mode.ECB, // 加密模式為ECBpadding: CryptoJS.pad.Pkcs7 // 填充方式為Pkcs7
});// 打印加密后的內容
console.log('加密后的內容:', encrypted.toString());// 解密文件內容
const decrypted = CryptoJS.AES.decrypt(encrypted, key, {mode: CryptoJS.mode.ECB, // 加密模式為ECBpadding: CryptoJS.pad.Pkcs7 // 填充方式為Pkcs7
});// 打印解密后的內容
console.log('解密后的內容:', decrypted.toString(CryptoJS.enc.Utf8));

然后我們對請求加密。

后端我是參照這個文章寫的,他是真正的大牛,感覺他的文章都寫的好有用,雖然自己看不懂。

AES+自定義密鑰實現加密解密(前端+后端)_crypto aes加密 自定義密鑰-CSDN博客

先生成我們要的秘鑰,然后把我們前端改了就行,我是在spring環境中,記得要在上面文件修改下,因為他好像不是spring環境下的配置。

成功了哈,我根據大佬文件改了改放在spring框架下也能用了,那么大致思路就有了,前端加密,后端解密就行了。

后端解密

大致思路有了,前端根據后端的秘鑰進行加密發送,后端解密即可,偷個小懶我就不寫了。

我把根據大佬修改后適配于spring環境下的配置文件寫在下面了,因為我發現很多文章都只是個類并不適配于spring環境,還要單獨修改,所以我改了那么一點點,弄出了工具類,大家粘貼復制即可。

package com.ruoyi.web.controller.utils;import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.stereotype.Component;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;/*** AES 加密工具類*/
@Component
public class AesUtil {// 加密算法RSApublic static final String KEY_ALGORITHM = "AES";//編碼方式public static final String CODE_TYPE = "UTF-8";//填充類型 AES/ECB/PKCS5Padding   AES/ECB/ISO10126Paddingpublic static final String AES_TYPE = "AES/ECB/PKCS5Padding";/*** 自定義內容加鹽,生成AES秘鑰*/public  String generateAESKey(){return DigestUtils.md5Hex(getSalt(6)).substring(8, 24);}/*** 隨機生成加鹽類*/public  String getSalt(int n){char[] chars = ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" +"1234567890!@#$%^&*()_+").toCharArray();StringBuilder stringBuilder = new StringBuilder();SecureRandom random = new SecureRandom();for(int i = 0; i < n; i++){stringBuilder.append(chars[random.nextInt(chars.length)]);}return stringBuilder.toString();}/*** 加密* @param clearText 明文* @param aesKey AES秘鑰* @return 加密串*/public String encryptAes(String clearText, String aesKey) {try {SecretKeySpec key = new SecretKeySpec(aesKey.getBytes(), KEY_ALGORITHM);Cipher cipher = Cipher.getInstance(AES_TYPE);cipher.init(Cipher.ENCRYPT_MODE, key);byte[] encryptedData = cipher.doFinal(clearText.getBytes(CODE_TYPE));return new BASE64Encoder().encode(encryptedData);} catch (Exception e) {throw new RuntimeException("加密失敗", e);}}/*** 解密* @param encryptText 密文* @param aesKey AES秘鑰* @return 解密串*/public  String decryptAes(String encryptText, String aesKey) {try {byte[] byteMi = new BASE64Decoder().decodeBuffer(encryptText);SecretKeySpec key = new SecretKeySpec(aesKey.getBytes(), KEY_ALGORITHM);Cipher cipher = Cipher.getInstance(AES_TYPE);cipher.init(Cipher.DECRYPT_MODE, key);byte[] decryptedData = cipher.doFinal(byteMi);return new String(decryptedData, CODE_TYPE);} catch (Exception e) {throw new RuntimeException("解密失敗", e);}}//  public static void main(String[] args) {
//    String aesKey = generateAESKey();
//    String json = "中文,abc,!@#";
//    //加密
//    System.out.println("字符串:" + json);
//    String encrypt = encryptAes(json, aesKey);
//    System.out.println(encrypt);
//    System.out.println("加密后字符串:" + encrypt);
//    //私鑰解密
//    System.out.println("解密后字符串:" + decryptAes(encrypt, aesKey));
//  }}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35399.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35399.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35399.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

四川音盛佳云電子商務有限公司抖音電商的先行者

在當今數字時代&#xff0c;電商行業風起云涌&#xff0c;各大平臺競相爭奪市場份額。而在這其中&#xff0c;四川音盛佳云電子商務有限公司以其獨特的抖音電商服務模式&#xff0c;悄然崛起&#xff0c;成為了行業中的一股不可忽視的力量。今天&#xff0c;就讓我們一起走進音…

【GD32F303紅楓派使用手冊】第二十六節 EXMC-液晶驅動實驗

26.1 實驗內容 通過本實驗主要學習以下內容&#xff1a; LCD顯示原理 EXMC NOR/SRAM模式時序和8080并口時序 LCD顯示控制 26.2 實驗原理 使用MCU的EXMC外設實現8080并口時序&#xff0c;和TFT-LCD控制器進行通信&#xff0c;控制LCD顯示圖片、字符、色塊等。 26.2.1 TFT…

圖像超分辨率重建

一、什么是圖像超分辨 圖像超分辨是一種技術&#xff0c;旨在通過硬件或軟件的方法提高原有圖像的分辨率。這一過程涉及從一系列低分辨率的圖像中獲取一幅高分辨率的圖像&#xff0c;實現了時間分辨率向空間分辨率的轉換。超分辨率重建的核心思想是利用多幀圖像序列的時間帶寬來…

計算機畢業設計Thinkphp/Laravel學生考勤管理系統zyoqy

管理員登錄學生考勤管理系統后&#xff0c;可以對首頁、個人中心、公告信息管理、年級管理、專業管理、班級管理、學生管理、教師管理、課程信息管理、學生選課管理、課程簽到管理、請假申請管理、銷假申請管理等功能進行相應操作&#xff0c;如圖5-2所示。學生登錄進入學生考勤…

金蝶云蒼穹考試題目大全

前言 受不了某些地方看個答案還要收費&#xff0c;總結多份試卷 題目有重復&#xff0c;關鍵字檢索即可 試卷一 金蝶云蒼穹考試題目大全 單選題 開發知識錯題反饋1.0分 1.關于編碼規則的適用范圍說法錯誤的是 A.單據沒有設置主業務組織的情況下&#xff0c;則校驗用戶當前登…

【Spine學習16】之 人物面部綁定

1、創建頭部骨骼 一根頭骨 以頭骨為父結點創建一個面部控制器face-holder 2、創建頭發和face面部控制結點的變換約束 左右頭發的約束指向為face結點 3、設定后發的變換約束&#xff0c;約束指向為face結點&#xff0c;反方向移動 設置參數為-100 同理&#xff0c;耳朵也依…

C# 中的 App.manifest 文件:優化應用程序配置與權限管理

前言 在開發 C# 應用程序時&#xff0c;可能會忽略一個重要的文件——App.manifest。這個文件看似不起眼&#xff0c;卻在應用程序的運行和用戶體驗上扮演著關鍵角色。了解和正確配置 App.manifest 文件&#xff0c;不僅可以確保應用程序在不同操作系統上的兼容性&#xff0c;…

解決uniapp,textarea拉起頁面被頂起和鍵盤被輸入框遮擋的問題。

1&#xff1a;Android、ios 同時解決&#xff1b; 2&#xff1a;我們在開發的時候會發現textarea或者input拉起鍵盤的時候整個頁面被頂起了&#xff0c;header也被頂沒了&#xff1b;官方給了:adjustPositionfalse屬性&#xff0c;設置完之后頁面就不會被頂起&#xff0c;但是…

談談SQL優化

SQL優化是數據庫性能優化中的關鍵環節&#xff0c;旨在提高查詢執行的效率和響應速度。下面是一些常見的SQL優化技巧和策略&#xff0c;涵蓋索引、查詢設計、表結構設計等方面&#xff1a; 1. 索引優化 創建索引&#xff1a;為常用查詢的過濾條件&#xff08;WHERE 子句&…

了解json

一.什么是json 1.什么是json是一種輕量級的數據交互&#xff0c;可以按照指定的json格式去組織和封裝數據 2.json本質上是一個帶有特定格式的字符串 二.json主要功能&#xff1a;json就是一種在各個編程語言中流通的數據格式&#xff0c;負責不同語言中的數據傳遞和交互&…

【Python時序預測系列】基于CNN+Bi-LSTM實現單變量時間序列預測(案例+源碼)

這是我的第309篇原創文章。 一、引言 基于CNN&#xff08;卷積神經網絡&#xff09;和Bi-LSTM&#xff08;雙向長短期記憶網絡&#xff09;的單變量時間序列預測是一種結合空間特征提取和時間依賴建模的方法。以下是一個基于Python和TensorFlow/Keras實現的示例&#xff0c;展…

C++ 高頻面試題

C 初級面試題及其詳細解答 1. 解釋 C 中的基本數據類型。 解答&#xff1a; C 提供了幾種基本數據類型&#xff0c;包括&#xff1a; int&#xff1a;整型&#xff0c;用于存儲整數。float 和 double&#xff1a;浮點型&#xff0c;用于存儲小數。char&#xff1a;字符型&am…

Android 強制使用移動網絡訪問接口

Android 強制使用移動網絡訪問接口_安卓連接wifi強制使用移動數據-CSDN博客 Android應用層實現恢復出廠設置功能_android7 intent 打開恢復出廠設置-CSDN博客

YOLOv8改進 | 主干網絡| 可變形卷積網絡C2f_DCN【CVPR2017】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本專欄所有程序均經過測試&#xff0c;可成功執行&#x1f4a1;&#x1f4a1;&#x1f4a1; 專欄目錄&#xff1a;《YOLOv8改進有效漲點》專欄介紹 & 專欄目錄 | 目前已有40篇內容&#xff0c;內含各種Head檢測頭、損失函數Loss、B…

java SQL server 多實例的情況

而對于java&#xff0c;對付多個數據庫實例就有些要注意的了&#xff1a; 首先&#xff0c;同樣連接字符串上加上“\實例名”&#xff1a; jdbc:sqlserver://127.0.0.1\\mssqlserver2008;DatabaseNameLPT; 此處應去掉端口1433。因為連接數據庫自命名實例的url中沒有端口號1433…

SiLM585x系列SiLM5851NHCG-DG一款具有分離的管腳輸出 單通道隔離驅動器 擁有強勁的驅動能力

SiLM585x系列SiLM5851NHCG-DG是一款單通道隔離驅動器&#xff0c;具有分離的管腳輸出&#xff0c;提供3.0A源電流和6.0A灌電流。主動保護功能包括退飽和過流檢測、UVLO、隔離故障報警和 2.5A 米勒鉗位。輸入側電源的工作電壓為3V至5.5V&#xff0c;輸出側電源的工作電壓范圍為1…

獨孤思維:研發的新賺錢項目,活脫脫掉了幾層皮

01 今天有個讀者問我&#xff0c;xx項目&#xff0c;成功概率多少&#xff1f; 其實這和做這個項目&#xff0c;能賺多少錢&#xff0c;本質是一個問題。 即&#xff0c;有多大的確定性。 言外之意&#xff0c;沒有確定性&#xff0c;不穩定&#xff0c;我就不做了。 可以…

一位軟件測試工程師繁忙的一天

早晨&#xff1a;啟動一天的工作 7:00 AM - 起床 早晨七點準時起床。洗漱、早餐后&#xff0c;檢查了手機上的郵件和消息&#xff0c;了解今天的工作安排和優先事項。 8:00 AM - 前往公司 乘坐地鐵前往公司。在地鐵上&#xff0c;他習慣性地閱讀一些技術博客&#xff0c;了解…

小柴沖刺嵌入式系統設計師系列總目錄

工作兩年 逐漸意識到基礎知識的重要性?? 意識到掌握了這個證書好像就已經掌握了80%工作中用到的知識了。剩下的就在工作的實戰中學習 來和小柴一起沖刺軟考吧&#xff01;加油&#x1f61c; 【小柴沖刺軟考中級嵌入式系統設計師系列】總目錄 前言 專欄目標&#xff1a;沖刺…

涵蓋多項功能的文件外發系統,了解一下

伴隨著業務范圍的不斷擴大&#xff0c;信息化的迅速發展&#xff0c;企業與客戶、供應商等合作伙伴之間的文件交換也愈加頻繁&#xff0c;尤其涉及到核心數據&#xff0c;像核心技術、設計圖紙等敏感數據&#xff0c;對其的保護也是越發重視。文件外發系統&#xff0c;應運而生…