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}")