当前位置:首页 » 《随便一记》 » 正文

java前后端加密解密crypto-js

12 人参与  2023年04月25日 12:45  分类 : 《随便一记》  评论

点击全文阅读


项目场景:

适用于接口数据敏感信息,比如 明文传输姓名、居住地址、手机号等信息,如果存在明文传输敏感数据问题、及数据泄漏风险,则可使用此方法加密解密。


一、下载crypot-js

1.如果为vue项目,安装cnpm,采用命令安装即可:

安装命令:cnpm install crypto-js;

2.如果为一般web项目,https://github.com/brix/crypto-js,进行下载;


二、前端引入crypto-js文件,并命名为secrt.js

import CryptoJS from 'crypto-js'

// 默认的 KEY 与 iv 如果没有给,可自行设定,但必须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();

}


三、前端页面引入并加密数据

import {Encrypt} from '../../secrt.js'

//text为需要加密的内容

var userId= Encrypt(text);

四、后端解密数据

1.pom引用

2.创建工具类

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值可以随机生成,确保与前端的key,iv对应
     */
    private static String KEY = "abcdefgh12345678";
    private static String IV = "12345678abcdefgh";

    /***
     * 加密
     * 
     * @param data 要加密的数据
     * @return encrypt
     */
    public static String encrypt(String data) {
        return encrypt(data, KEY, IV);
    }
    
    /***

     *  解密
     * @param data 要解密的数据
     */
    public static String desEncrypt(String data) {
        return desEncrypt(data, KEY, IV);
    }

    /**
     * 加密方法
     */
    private static String encrypt(String data, String key, String iv) {
        try {
            // "算法/模式/补码方式"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.数据解密

@GetMapping(value = "/userInfo")
 public getUserInfo(@RequestParam(name = "userId") String userId)
    String userId= desEncrypt(userId);
}


点击全文阅读


本文链接:http://zhangshiyu.com/post/60016.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 我怀孕后,患者要求我打掉孩子帮她后续结局_许燕徐燕高分神作_小说后续在线阅读_无删减免费完结_
  • 全书浏览重生后联姻丈夫爱上KTV小妹,我死遁了(姜满裴聿琛温舒柠)_重生后联姻丈夫爱上KTV小妹,我死遁了(姜满裴聿琛温舒柠)全书结局
  • 时筠荣景琛小说(荣少的步步沦陷)外篇+结局(时筠荣景琛)全篇在线阅读
  • 重生在高考前,我笑着送小青梅和小混混去庆祝成人礼老书虫(沈晏安乔念),重生在高考前,我笑着送小青梅和小混混去庆祝成人礼老书虫
  • 送子观音优质(殷茵程沐白)全书免费_(殷茵程沐白)送子观音优质后续(殷茵程沐白)
  • 重生后,我笑送全班去三亚毕业旅行推荐_徐凯沈清别以为阅读_小说后续在线阅读_无删减免费完结_
  • 北风秋霜覆往忆完结+结局+番外(傅砚寒沈沐柒)全书浏览_北风秋霜覆往忆完结+结局+番外全书浏览
  • 小说大结局小说罗毅小说已更新+特别篇(转职神级辅助,转身上报国家!)纯净版
  • 碎骨揉香与君长诀精修版(褚明意萧鹤明)全书浏览_碎骨揉香与君长诀精修版全书浏览
  • 只因一块表,闺蜜害死我全家热门榜首_陆哲轩李俏陆少爆火全网_小说后续在线阅读_无删减免费完结_
  • 折寒枝簪起霜思全章+后续+结局(宋闻璟沈棠眠)_折寒枝簪起霜思全章+后续+结局(宋闻璟沈棠眠)
  • 高考前一周我绑定了上分系统(袁文淼徐靓靓)_高考前一周我绑定了上分系统(袁文淼徐靓靓)

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1