java前后端加密解密crypto-js的實(shí)現(xiàn)
項(xiàng)目場(chǎng)景:
適用于接口數(shù)據(jù)敏感信息,比如 明文傳輸姓名、居住地址、手機(jī)號(hào)等信息,如果存在明文傳輸敏感數(shù)據(jù)問(wèn)題、及數(shù)據(jù)泄漏風(fēng)險(xiǎn),則可使用此方法加密解密。
一、下載crypot-js
1.如果為vue項(xiàng)目,安裝cnpm,采用命令安裝即可:
安裝命令:cnpm install crypto-js;
2.如果為一般web項(xiàng)目,https://github.com/brix/crypto-js,進(jìn)行下載;
二、前端引入crypto-js文件,并命名為secrt.js
import CryptoJS from 'crypto-js' // 默認(rèn)的 KEY 與 iv 如果沒有給,可自行設(shè)定,但必須16位 const KEY = CryptoJS.enc.Utf8.parse("abcdefgh12345678"); const IV = CryptoJS.enc.Utf8.parse('12345678abcdefgh'); /** ?* AES加密 :字符串 key iv ?返回base64 ?*/ export function Encrypt(word, keyStr, ivStr) { ? ? let key = KEY; ? ? let iv = IV; ? ? if (keyStr) { ? ? ? ? key = CryptoJS.enc.Utf8.parse(keyStr); ? ? ? ? iv = CryptoJS.enc.Utf8.parse(ivStr); ? ? } ? ? let srcs = CryptoJS.enc.Utf8.parse(word); ? ? var encrypted = CryptoJS.AES.encrypt(srcs, key, { ? ? ? ? iv: iv, ? ? ? ? mode: CryptoJS.mode.CBC, ? ? ? ? padding: CryptoJS.pad.ZeroPadding ? ? }); ? ? return CryptoJS.enc.Base64.stringify(encrypted.ciphertext); } /** ?1. AES 解密 :字符串 key iv ?返回base64 ?2. ?3. @return {string} ?*/ export function Decrypt(word, keyStr, ivStr) { ? ? let key = KEY; ? ? let iv = IV; ? ? if (keyStr) { ? ? ? ? key = CryptoJS.enc.Utf8.parse(keyStr); ? ? ? ? iv = CryptoJS.enc.Utf8.parse(ivStr); ? ? } ? ? let base64 = CryptoJS.enc.Base64.parse(word); ? ? let src = CryptoJS.enc.Base64.stringify(base64); ? ? let decrypt = CryptoJS.AES.decrypt(src, key, { ? ? ? ? iv: iv, ? ? ? ? mode: CryptoJS.mode.CBC, ? ? ? ? padding: CryptoJS.pad.ZeroPadding ? ? }); ? ? let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8); ? ? return decryptedStr.toString(); }
三、前端頁(yè)面引入并加密數(shù)據(jù)
import {Encrypt} from '../../secrt.js' //text為需要加密的內(nèi)容 var userId= Encrypt(text);
四、后端解密數(shù)據(jù)
1.pom引用
2.創(chuàng)建工具類
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public class SecretUtil { ? ? /*** ? ? ?* key和iv值可以隨機(jī)生成,確保與前端的key,iv對(duì)應(yīng) ? ? ?*/ ? ? private static String KEY = "abcdefgh12345678"; ? ? private static String IV = "12345678abcdefgh"; ? ? /*** ? ? ?* 加密 ? ? ?*? ? ? ?* @param data 要加密的數(shù)據(jù) ? ? ?* @return encrypt ? ? ?*/ ? ? public static String encrypt(String data) { ? ? ? ? return encrypt(data, KEY, IV); ? ? } ? ? /*** ? ? ?* ?解密 ? ? ?* @param data 要解密的數(shù)據(jù) ? ? ?*/ ? ? public static String desEncrypt(String data) { ? ? ? ? return desEncrypt(data, KEY, IV); ? ? } ? ? /** ? ? ?* 加密方法 ? ? ?*/ ? ? private static String encrypt(String data, String key, String iv) { ? ? ? ? try { ? ? ? ? ? ? // "算法/模式/補(bǔ)碼方式"NoPadding PkcsPadding ? ? ? ? ? ? Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); ? ? ? ? ? ? int blockSize = cipher.getBlockSize(); ? ? ? ? ? ? byte[] dataBytes = data.getBytes(); ? ? ? ? ? ? int plaintextLength = dataBytes.length; ? ? ? ? ? ? if (plaintextLength % blockSize != 0) { ? ? ? ? ? ? ? ? plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize)); ? ? ? ? ? ? } ? ? ? ? ? ? byte[] plaintext = new byte[plaintextLength]; ? ? ? ? ? ? System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length); ? ? ? ? ? ? SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES"); ? ? ? ? ? ? IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); ? ? ? ? ? ? cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); ? ? ? ? ? ? byte[] encrypted = cipher.doFinal(plaintext); ? ? ? ? ? ? return new Base64().encodeToString(encrypted); ? ? ? ? } catch (Exception e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? ? ? return null; ? ? ? ? } ? ? } ? ? /** ? ? ?* 解密方法 ? ? ?*/ ? ? private static String desEncrypt(String data, String key, String iv) { ? ? ? ? try { ? ? ? ? ? ? byte[] encrypted1 = new Base64().decode(data); ? ? ? ? ? ? Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); ? ? ? ? ? ? SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES"); ? ? ? ? ? ? IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes()); ? ? ? ? ? ? cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); ? ? ? ? ? ? byte[] original = cipher.doFinal(encrypted1); ? ? ? ? ? ? return new String(original).trim(); ? ? ? ? } catch (Exception e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? ? ? return null; ? ? ? ? } ? ? } }
3.數(shù)據(jù)解密
@GetMapping(value = "/userInfo") public getUserInfo(@RequestParam(name = "userId") String userId) String userId= desEncrypt(userId); }
到此這篇關(guān)于java前后端加密解密crypto-js的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)java 加密解密crypto-js內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- VueJs里利用CryptoJs實(shí)現(xiàn)加密及解密的方法示例
- Vue中使用crypto-js AES對(duì)稱加密算法實(shí)現(xiàn)加密解密
- 前端加密cryptojs與JSEncrypt使實(shí)例詳解
- vue項(xiàng)目使用md5加密、crypto-js加密、國(guó)密sm3及國(guó)密sm4的方法
- CryptoJs常規(guī)密碼加密demo
- JS使用 cryptojs加密解密(對(duì)稱加密庫(kù))的問(wèn)題
- js前端加密庫(kù)Crypto-js進(jìn)行MD5/SHA256/BASE64/AES加解密的方法與示例
- 前端CryptoJS加密、后端JAVA解密代碼實(shí)現(xiàn)參考
相關(guān)文章
Calcite使用SQL實(shí)現(xiàn)查詢csv/json文件內(nèi)容
calcite可以支持文件系統(tǒng)的數(shù)據(jù)源適配, 其實(shí)官方已經(jīng)提供了相應(yīng)的能力, 其支持csv和json的查詢適配,下面我們就來(lái)看看Calcite如何使用SQL實(shí)現(xiàn)查詢csv/json文件內(nèi)容吧2025-01-01關(guān)于idea中ssm框架的編碼問(wèn)題分析
在實(shí)際開發(fā)中需要將操作系統(tǒng)編碼、文件編碼、頁(yè)面編碼以及tomcat服務(wù)器編碼保持一致,而tomcat在默認(rèn)情況下是使用UTF-8,這就使得其打印的日志文件出現(xiàn)中文亂碼,因此在一般情況下,只需要將tomcat服務(wù)器的編碼改為GBK即可2021-06-06SpringBoot實(shí)現(xiàn)elasticsearch索引操作的代碼示例
這篇文章主要給大家介紹了SpringBoot如何實(shí)現(xiàn)elasticsearch 索引操作,文中有詳細(xì)的代碼示例,感興趣的同學(xué)可以參考閱讀下2023-07-07Java的NIO之并發(fā)環(huán)境下非阻塞IO技術(shù)詳解
這篇文章主要介紹了Java的NIO之并發(fā)環(huán)境下非阻塞IO技術(shù)詳解,Java NIO(New IO)是Java平臺(tái)提供的一種用于高效處理I/O操作的API,它引入了一組新的類和概念,以提供更好的性能和可擴(kuò)展性,需要的朋友可以參考下2023-09-09基于application和bootstrap的加載順序及區(qū)別說(shuō)明
這篇文章主要介紹了application和bootstrap的加載順序及區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07eclipse自動(dòng)提示和自動(dòng)補(bǔ)全功能實(shí)現(xiàn)方法
這篇文章主要介紹了eclipse自動(dòng)提示和自動(dòng)補(bǔ)全的相關(guān)內(nèi)容,文中向大家分享了二者的實(shí)現(xiàn)方法代碼,需要的朋友可以了解下。2017-09-09一文學(xué)會(huì)如何在SpringBoot中使用線程池執(zhí)行定時(shí)任務(wù)
在開發(fā)現(xiàn)代應(yīng)用程序時(shí),定時(shí)任務(wù)是一項(xiàng)常見的需求,SpringBoot提供了一個(gè)強(qiáng)大的定時(shí)任務(wù)框架,可以輕松地執(zhí)行各種定時(shí)任務(wù),結(jié)合線程池的使用,可以更好地管理任務(wù)的執(zhí)行,提高系統(tǒng)的性能和穩(wěn)定性,本文將介紹如何在Spring Boot中使用線程池執(zhí)行定時(shí)任務(wù)2023-06-06Java class文件格式之?dāng)?shù)據(jù)類型_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java class文件格式之?dāng)?shù)據(jù)類型的相關(guān)資料,需要的朋友可以參考下2017-06-06