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
import base64
import requests
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
 
 
class TokenValidator:
    def __init__(self):
        pass
 
    def encrypt(self, word: str, keyStr: str = "abcdefgh12345678", ivStr: str = "12345678abcdefgh") -> str:
        """
        加密函数说明:
          - word:待加密的文本(字符串)
          - keyStr:密钥字符串(默认使用 "abcdefgh12345678")
          - ivStr:初始向量字符串(默认使用 "12345678abcdefgh")
 
        加密过程:
          1. 将 keyStr 和 ivStr 使用 UTF-8 编码转换为字节
          2. 将 word 转为字节后进行 PKCS7 填充
          3. 使用 AES 的 CBC 模式加密数据
          4. 对加密结果进行 Base64 编码返回
        """
        # 将 key 与 iv 转为字节(默认使用 16 字节,即 AES-128)
        key = keyStr.encode('utf-8')
        iv = ivStr.encode('utf-8')
 
        # 明文转字节
        plaintext = word.encode('utf-8')
 
        # 使用 PKCS7 填充补全明文到 16 字节的整数倍
        padded_plaintext = pad(plaintext, AES.block_size)
 
        # 创建 AES-CBC 加密器
        cipher = AES.new(key, AES.MODE_CBC, iv)
        encrypted_bytes = cipher.encrypt(padded_plaintext)
 
        # 返回 Base64 编码的密文字符串
        return base64.b64encode(encrypted_bytes).decode('utf-8')
 
    def get_token(self, domain: str, username: str, password: str) -> str:
        """
        通过加密后的账号密码请求登录接口获取token
        :param domain: 域名,如 http://example.com
        :param username: 明文账号
        :param password: 明文密码
        :return: token字符串
        """
        # 加密账号密码
        encrypted_username = self.encrypt(username)
        encrypted_password = self.encrypt(password)
 
        # 构建登录接口URL
        login_url = f"{domain}/api/sys/login"
 
        # 构建请求头
        headers = {
            "Content-Type": "application/json; charset=UTF-8",
            "Cookie": f"x-domain={domain.split('://')[-1]}"
        }
 
        # 构建请求体
        data = {
            "username": encrypted_username,
            "password": encrypted_password,
            "code": ""
        }
 
        # 发送请求
        response = requests.post(login_url, headers=headers, json=data)
        response.raise_for_status()  # 检查请求是否成功
 
        # 解析响应,返回token
        result = response.json()
        return result.get("token", "")
 
 
# 示例用法
if __name__ == '__main__':
    token_validator = TokenValidator()
    
    # 测试加密方法
    username = "hyb实验人员"
    password = "Baoyi@1341"
    encrypted_username = token_validator.encrypt(username)
    encrypted_password = token_validator.encrypt(password)
    print(f"加密后的用户名:{encrypted_username}")
    print(f"加密后的密码:{encrypted_password}")
    
    # 测试获取token方法(需要实际域名才能运行)
    domain = "http://tsinghua.baoyizn.com:9906/"
    token = token_validator.get_token(domain, username, password)
    print(f"获取到的token:{token}")