python Запуск программы при наличии сертификата
Пишу программу на питоне, хочу сделать систему сертификатов. То есть сделать так, чтобы я у себя на сервере создавал сертификат, передавал его пользователю на другой пк, и моя программа работала. Как именно реализовать проверку наличия и срока действия этого сертификата, а также его создание при помощи питона? При попытке запуска приложения без наличия сертификата или с сертификатом с истекшим сроком действия программа должна выдавать что-то типа уведомления об ошибке "нет доступных сертификатов" и программа закрывалась
Ответы (1 шт):
Вот простой пример:cryptodate.py
Программа для шифрования секретного ключа с датой истекающей лицензии. Формат ввода - год, месяц, день: 20240127
import random
from cryptography.fernet import Fernet
# key = Fernet.generate_key() # Генерация случайного ключа
# Ключ для шифрования
key = "TcIBhIEmQ1Nihgjm8W77bmMUEsJcDnxBH9fzeou4K_0="
cipher = Fernet(key)
def add_digits(input_string):
new_string = ''
for char in input_string:
random_digits = ''.join(random.choices('0123456789', k=4))
new_string += random_digits + char
return new_string
input_string = input("Введите дату(год, месяц и день -20240120): ")
combined_string = add_digits(input_string)
filename = "license.dll"
# Шифрование содержимого файла
encrypted_data = cipher.encrypt(combined_string.encode())
with open(filename, 'wb') as file:
file.write(encrypted_data)
Класс для проверки ключа: checklicense.py
from datetime import datetime
from cryptography.fernet import Fernet
class DateProcessor:
def __init__(self, filename):
self.filename = filename
self.current_datetime = datetime.now()
key = "TcIBhIEmQ1Nihgjm8W77bmMUEsJcDnxBH9fzeou4K_0="
self.cipher = Fernet(key)
def read_date_from_file(self):
with open(self.filename, 'rb') as file:
data = file.read()
# Расшифровка данных
data = self.cipher.decrypt(data).decode()
# Извлекаем дату из файла, предполагая, что каждый пятый символ - это число даты
date_from_file = data[4::5]
return date_from_file
def process_date(self, date_string):
# Извлекаем год, месяц и день из строки
year_from_file = int(date_string[:4])
month_from_file = int(date_string[4:6])
day_from_file = int(date_string[6:8])
# Создаем объект datetime из полученных значений
return datetime(year_from_file, month_from_file, day_from_file, 0, 0, 0)
def check_target_date(self):
date_from_file = self.read_date_from_file()
target_date_from_file = self.process_date(date_from_file)
print(date_from_file)
print(target_date_from_file)
print(self.current_datetime)
# Явно преобразуем текущую дату в объект datetime
current_datetime = datetime(self.current_datetime.year, self.current_datetime.month,
self.current_datetime.day, 0, 0, 0)
if current_datetime >= target_date_from_file:
print("Целевая дата из файла - это сегодня или уже прошла.")
sys.exit()
else:
print("Целевая дата из файла еще не наступила.")
if __name__ == '__main__':
current_directory = "C:\\Users\\Amgarak"
folder_path = os.path.join(current_directory, 'license.dll')
processor = DateProcessor(folder_path)
processor.check_target_date()
Если ключ просрочен, то отработает sys.exit() и остальная программа не отработает.
license.dll
gAAAAABlqosj_SuvYzB-3bZZIyNqi7oOPb1IFkV0ph-d_I2abNI5WpzsCoSDMX8J8A0JSkuU99TT48pAQMZ0HvpIhdxqRRGy_B75AGgup2PSkDSjE2o5pSJoQCyK_fAljvofkqDpLNVR