• vue前端密码加密,springboot后端密码解密


    1.模块安装

    1

    npm install crypto-js

    2.src–>util–>secret.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50

    import CryptoJS from 'crypto-js'

    // 默认的 KEY 与 iv 如果没有给
    const KEY = CryptoJS.enc.Utf8.parse("1234567890123456");
    const IV = CryptoJS.enc.Utf8.parse('1234567890123456');
    /**
     * 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);

    }
    /**
     * AES 解密 :字符串 key iv  返回base64
     *
     * @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();
    }

    3.login.vue引入加密方法

    1

    import {Encrypt} from '../utils/Secret.js'

    4.login.vue登录请求发起,对密码参数加密

    1
    2
    3
    4

     let param={
              username:this.loginForm.username,
              password:Encrypt(this.loginForm.password)  //密码加密
            }

    5.后端pom.xml

    1
    2
    3
    4
    5
    6


           
                org.bouncycastle
                bcprov-jdk15on
                1.60
           

    6.后端utils–>secretUtil.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98

    package com.unccr.ms.utils;

    import org.apache.tomcat.util.codec.binary.Base64;

    import javax.crypto.Cipher;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;


        /**
         * @author YSK
         * @date 2020/8/24 13:13
         */
        public  class SecretUtil {
            /***
             * key和iv值可以随机生成
             */
            private static String KEY = "1234567890123456";

            private static String IV = "1234567890123456";

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

            /***
             * param data 需要解密的数据
             * 调用desEncrypt()方法
             */
            public static String desEncrypt(String data){
                return desEncrypt(data, KEY, IV);
            }

            /**
             * 加密方法
             * @param data  要加密的数据
             * @param key 加密key
             * @param iv 加密iv
             * @return 加密的结果

             */
            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;
                }
            }

            /**
             * 解密方法
             * @param data 要解密的数据
             * @param key  解密key
             * @param iv 解密iv
             * @return 解密的结果
             */
            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;
                }
            }
    }

    7.登录Controller对前端传来的密码解密(先导入加密工具类)

    1
    2

    //      SecretUtil.desEncrypt:  前端传来的加密密码进行解密
            User user=userService.loginByInfo(username, SecretUtil.desEncrypt(password));

    8.结果测试
    请求中密码已被加密。
    后端控制台打印输出加密后的密码(与前端传来一致),解密后与原来的密码相同。

  • 相关阅读:
    Spring Cloud Alibaba【转账功能实现上、转账功能实现下、没有引入分布式事物问题演示、项目引入Seata 】(十一)
    element 树组件 tree 横向纵向滚动条
    【DevOps实战之k8s】使用Prometheus和Grafana监控K8S集群
    信息安全-工控安全需求分析与安全保护工程
    c++数据结构:图(邻接表)
    过滤器(Filter)
    函数是否使用结构体C++引用情况说明
    第七部分:Maven(项目管理工具)
    Linux中 cpu负载和cpu利用率的区别
    Matplotlib plt.plot数据可视化应用案例
  • 原文地址:https://blog.csdn.net/sinat_41617212/article/details/125597031