kaiyu
2022-01-13 c492a224f8f89cca822e7539fe9a570415a6094e
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package com.moral.util;
 
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 
/**
 * @ClassName TokenEncryptUtils
 * @Description token加密、解密工具
 * @Author 陈凯裕
 * @Date 2021/3/10 11:50
 * @Version TODO
 **/
@Component
@Slf4j
public class TokenEncryptUtils {
 
    private static  String key;
 
    @Value("${TOKEN.KEY}")
    public void setKey(String tokenKey){
        this.key = tokenKey;
    }
 
    /**
     * 加密
     * @param str
     * @return
     */
    public static String encoded(String str) {
        return strToHex(encodedString(str, key));
    }
 
 
    /**
    * @Description: 解密
            * @Param: [str]
            * @return: java.lang.String
            * @Author: 陈凯裕
            * @Date: 2021/3/10
            */
    public static String decoded(String str) {
        String hexStr = null;
        try {
            hexStr = hexStrToStr(str);
        } catch (Exception e) {
            log.error("token解密失败"+e.getMessage());
        }
        if (hexStr != null) {
            hexStr = encodedString(hexStr, key);
        }
        return hexStr;
    }
 
    /**
     * 转换
     * @param str
     * @param password
     * @return
     */
    private static String encodedString(String str, String password) {
        char[] pwd = password.toCharArray();
        int pwdLen = pwd.length;
 
        char[] strArray = str.toCharArray();
        for (int i=0; i<strArray.length; i++) {
            strArray[i] = (char)(strArray[i] ^ pwd[i%pwdLen] ^ pwdLen);
        }
        return new String(strArray);
    }
 
    /** 
    * @Description: 16进制转换字符串
            * @Param: [hexStr]
            * @return: java.lang.String
            * @Author: 陈凯裕
            * @Date: 2021/3/10
            */ 
    private static String hexStrToStr(String hexStr) {
        return new String(hexStrToBytes(hexStr));
    }
 
    /** 
    * @Description: 16进制字符串转换字节数组
            * @Param: [hexStr]
            * @return: byte[]
            * @Author: 陈凯裕
            * @Date: 2021/3/10
            */ 
    private static byte[] hexStrToBytes(String hexStr) {
        String hex;
        int val;
        byte[] btHexStr = new byte[hexStr.length()/2];
        for (int i=0; i<btHexStr.length; i++) {
            hex = hexStr.substring(2*i, 2*i+2);
            val = Integer.valueOf(hex, 16);
            btHexStr[i] = (byte) val;
        }
        return btHexStr;
    }
 
    /**
    * @Description: 字节数组转换16进制字符串
            * @Param: [bytesArray]
            * @return: java.lang.String
            * @Author: 陈凯裕
            * @Date: 2021/3/10
            */
    private static String bytesToHexStr(byte[] bytesArray) {
        StringBuilder builder = new StringBuilder();
        String hexStr;
        for (byte bt : bytesArray) {
            hexStr = Integer.toHexString(bt & 0xFF);
            if (hexStr.length() == 1) {
                builder.append("0");
                builder.append(hexStr);
            }else{
                builder.append(hexStr);
            }
        }
        return builder.toString();
    }
 
    /**
     * @Description: 字符串转为16进制
     * @Param: [s]
     * @return: java.lang.String
     * @Author: 陈凯裕
     * @Date: 2021/3/10
     */
    private static String strToHex(String s) {
        return bytesToHexStr(s.getBytes());
    }
 
    public static void main(String[] args) {
        long currentTime  = System.currentTimeMillis();
        System.out.println("加密前的token:"+"25."+currentTime);
        String token = encoded("25" +"/"+ currentTime);
        String[] decoded = decoded(token).split("/");
        System.out.println("生成的token:"+token);
        for (String s : decoded) {
            System.out.println("解析后的token:"+s);
        }
    }
 
}