103 lines
No EOL
4.6 KiB
Python
103 lines
No EOL
4.6 KiB
Python
import requests
|
||
import base64
|
||
import hashlib
|
||
|
||
from Cryptodome.Cipher import AES
|
||
from Cryptodome.Util.Padding import pad
|
||
|
||
from constants import SMC_LICENSE_KEY, NDR_LICENSE_KEY
|
||
|
||
USER_NAME = "root"
|
||
USER_ROLE = "admin"
|
||
FRONT_IP = "192.168.0.1"
|
||
|
||
# Функция считывания общего ключа
|
||
def shared_key_reader():
|
||
# Считываем общий секрет
|
||
with open("secretShared.bin", "rb") as shared_file:
|
||
# Считываем содержимое файла и преобразуем его в шестнадцатиричное представление с помощью
|
||
# функции hex()
|
||
shared_secret = shared_file.read().hex()
|
||
|
||
return shared_secret
|
||
|
||
SHARED_KEY = shared_key_reader()
|
||
# Константы для запроса
|
||
|
||
# Authorization-key
|
||
# Данные, которе требуется зашифровать
|
||
# data = (SMC_LICENSE_KEY + NDR_LICENSE_KEY).encode("utf-8")
|
||
|
||
# POSTMAN
|
||
pre_data = base64.b64encode((SMC_LICENSE_KEY + NDR_LICENSE_KEY).encode('utf-8'))
|
||
|
||
# Преобразуем SHARED_KEY в байтовую строку с использованием кодировки UTF-8
|
||
key = SHARED_KEY
|
||
|
||
# Создаем инвертированный закодированный ключ
|
||
encoded_reversed_key = key[::-1].encode("utf-8")
|
||
|
||
# Вычисление вектора инициализации следующим образом:
|
||
# Берется hash-сумма MD5 от инвертированного общего ключа
|
||
# C помощью функции hexdigest() получаем строкове представление хэш суммы в виде 16ричных чисел
|
||
# Обрезаем полученое строковое представление до 16 символов
|
||
# Кодируем получившуюся строку в UTF-8
|
||
iv = hashlib.md5(encoded_reversed_key).hexdigest()[:16].encode('utf-8')
|
||
|
||
# Вычисляем хэш-сумму MD5 и представляем ее в 16ричном виде, а затем кодируем в UTF-8
|
||
key_hash = hashlib.md5(key.encode('utf-8')).hexdigest()
|
||
|
||
# Создаем объект cipher от класса AES с использованием ключа key, режима AES.MODE_CBS
|
||
# (Cipher Block Chaining) и вектора инициализации iv
|
||
cipher = AES.new(key_hash.encode('utf-8'), AES.MODE_CBC, iv)
|
||
|
||
# Получаем шифр путем:
|
||
# С помощью функции pad() данные data дополняются до размера блока AES и шифруются объектом cipher
|
||
encrypted = cipher.encrypt(pad(pre_data, AES.block_size))
|
||
|
||
# Полученное преобразуем в base64
|
||
encrypted_base64_authorization_key = base64.b64encode(encrypted).decode('utf-8')
|
||
authorization_key_header_data = "x-ndr-key " + encrypted_base64_authorization_key
|
||
|
||
# Authorization user
|
||
user_data = base64.b64encode(USER_NAME.encode('utf-8'))
|
||
cipher_user = AES.new(key_hash.encode('utf-8'), AES.MODE_CBC, iv)
|
||
encrypted_user = cipher_user.encrypt(pad(user_data, AES.block_size))
|
||
encrypted_base64_authorization_user = base64.b64encode(encrypted_user).decode('utf-8')
|
||
|
||
authorization_user_header_data = "x-ndr-user " + encrypted_base64_authorization_user
|
||
|
||
|
||
# Authorization role
|
||
user_role_data = base64.b64encode(USER_ROLE.encode('utf-8'))
|
||
cipher_role = AES.new(key_hash.encode('utf-8'), AES.MODE_CBC, iv)
|
||
encrypted_user_role = cipher_role.encrypt(pad(user_role_data, AES.block_size))
|
||
encrypted_base64_authorization_role = base64.b64encode(encrypted_user_role).decode('utf-8')
|
||
|
||
authorization_role_header_data = "x-ndr-role " + encrypted_base64_authorization_role
|
||
|
||
# Authorization ip
|
||
ip_data = base64.b64encode(FRONT_IP.encode('utf-8'))
|
||
cipher_ip = AES.new(key_hash.encode('utf-8'), AES.MODE_CBC, iv)
|
||
encrypted_ip = cipher_ip.encrypt(pad(ip_data, AES.block_size))
|
||
encrypted_base64_authorization_ip = base64.b64encode(encrypted_ip).decode('utf-8')
|
||
|
||
authorization_ip_header_data = "x-ndr-ip " + encrypted_base64_authorization_ip
|
||
|
||
# print("\n\n\n")
|
||
# print("key = " + encrypted_base64_authorization_key)
|
||
# print("user = " + encrypted_base64_authorization_user)
|
||
# print("role = " + encrypted_base64_authorization_role)
|
||
# print("ip = " + encrypted_base64_authorization_ip)
|
||
# print("\n\n\n")
|
||
|
||
# Запрос
|
||
request_url = "https://192.168.56.10:8000/api/v1/auth/session/login"
|
||
headers = {
|
||
"Authorization-key": authorization_key_header_data,
|
||
"Authorization-user": authorization_user_header_data,
|
||
"Authorization-role": authorization_role_header_data,
|
||
"Authorization-ip": authorization_ip_header_data,
|
||
}
|
||
|
||
response = requests.post(request_url, headers=headers, verify=False) |