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

七夜zippoe 2024-08-03 17:33:01 阅读 97

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

<!--密码解密-->

        <dependency>

            <groupId>org.bouncycastle</groupId>

            <artifactId>bcprov-jdk15on</artifactId>

            <version>1.60</version>

        </dependency>

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.结果测试

请求中密码已被加密。

后端控制台打印输出加密后的密码(与前端传来一致),解密后与原来的密码相同。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。