sandbox/ndr/connection/login_to_ndr.py
2024-11-02 14:14:15 +03:00

103 lines
No EOL
4.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)