最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java前后端加密解密crypto-js的實(shí)現(xiàn)

 更新時(shí)間:2023年05月22日 10:19:47   作者:漁夫搬磚  
這篇文章主要介紹了java前后端加密解密crypto-js的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

項(xiàng)目場(chǎng)景:

適用于接口數(shù)據(jù)敏感信息,比如 明文傳輸姓名、居住地址、手機(jī)號(hào)等信息,如果存在明文傳輸敏感數(shù)據(jù)問題、及數(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于SpringBoot使用@Async的總結(jié)

    關(guān)于SpringBoot使用@Async的總結(jié)

    這篇文章主要介紹了關(guān)于SpringBoot使用@Async的總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring?@Conditional通過條件控制bean注冊(cè)過程

    Spring?@Conditional通過條件控制bean注冊(cè)過程

    這篇文章主要為大家介紹了Spring?@Conditional通過條件控制bean注冊(cè)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • MybatisPlus一對(duì)多聯(lián)表查詢及分頁(yè)的解決過程

    MybatisPlus一對(duì)多聯(lián)表查詢及分頁(yè)的解決過程

    文章主要介紹了在使用MyBatis-Plus進(jìn)行一對(duì)多查詢時(shí)遇到的分頁(yè)問題及解決方案,在一對(duì)多場(chǎng)景下,直接映射會(huì)導(dǎo)致分頁(yè)數(shù)據(jù)數(shù)量不正確,而使用子查詢映射則可以解決這個(gè)問題,此外,通過在Java代碼中使用Stream進(jìn)行關(guān)聯(lián)處理,可以進(jìn)一步優(yōu)化查詢性能,避免多次子查詢帶來的效率問題
    2025-12-12
  • Java Hibernate中的查詢策略和抓取策略

    Java Hibernate中的查詢策略和抓取策略

    Hibernate是一種Java對(duì)象關(guān)系映射框架,提供了多種查詢和抓取策略,用于優(yōu)化數(shù)據(jù)庫(kù)訪問性能。查詢策略包括延遲加載、立即加載、查詢緩存等,抓取策略包括join抓取、子查詢抓取、批量抓取等。這些策略可以根據(jù)實(shí)際應(yīng)用場(chǎng)景進(jìn)行選擇和配置,提高數(shù)據(jù)訪問的效率和穩(wěn)定性
    2023-04-04
  • Spring在多線程下@Resource注入為null的問題

    Spring在多線程下@Resource注入為null的問題

    這篇文章主要介紹了Spring在多線程下@Resource注入為null的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java中常用時(shí)間的一些相關(guān)方法

    Java中常用時(shí)間的一些相關(guān)方法

    日期的使用多種多樣,但萬(wàn)變不離其宗,下面這篇文章主要給大家介紹了關(guān)于Java中常用時(shí)間的一些相關(guān)方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • SpringBoot中的@FeignClient注解使用

    SpringBoot中的@FeignClient注解使用

    文章主要介紹了SpringCloud中的@FeignClient注解的使用及其參數(shù)詳解,包括value/name、url、path、configuration、fallback/fallbackFactory、contextId等,通過@FeignClient注解,可以方便地聲明一個(gè)REST客戶端,并定義與目標(biāo)服務(wù)通信的接口
    2024-11-11
  • Java根據(jù)正整數(shù)的位數(shù)并逆序打印出各位數(shù)字

    Java根據(jù)正整數(shù)的位數(shù)并逆序打印出各位數(shù)字

    給一個(gè)不多于5位的正整數(shù),要求:一、求它是幾位數(shù),二、逆序打印出各位數(shù)字,需要的朋友可以參考下
    2017-02-02
  • 深入理解DevOps+微服務(wù)框架

    深入理解DevOps+微服務(wù)框架

    這篇文章主要介紹了深入理解DevOps+微服務(wù),主要包括DevOps 的三大支柱之中,即人(People)、流程(Process)和平臺(tái)(Platform)的知識(shí)講解,需要的朋友可以參考下
    2022-05-05
  • 在日志中記錄Java異常信息的正確姿勢(shì)分享

    在日志中記錄Java異常信息的正確姿勢(shì)分享

    這篇文章主要介紹了在日志中記錄Java異常信息的正確姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論

镇赉县| 黎平县| 大冶市| 九江市| 乌兰察布市| 调兵山市| 额尔古纳市| 太仆寺旗| 合作市| 紫金县| 太谷县| 南丰县| 白沙| 郴州市| 奇台县| 法库县| 延长县| 连山| 旌德县| 桃源县| 榕江县| 嘉黎县| 科技| 行唐县| 四子王旗| 柘荣县| 都昌县| 诸城市| 武宁县| 界首市| 徐州市| 蛟河市| 曲沃县| 视频| 沧州市| 安国市| 永靖县| 镇雄县| 黄大仙区| 和林格尔县| 万年县|