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