python Запуск программы при наличии сертификата

Пишу программу на питоне, хочу сделать систему сертификатов. То есть сделать так, чтобы я у себя на сервере создавал сертификат, передавал его пользователю на другой пк, и моя программа работала. Как именно реализовать проверку наличия и срока действия этого сертификата, а также его создание при помощи питона? При попытке запуска приложения без наличия сертификата или с сертификатом с истекшим сроком действия программа должна выдавать что-то типа уведомления об ошибке "нет доступных сертификатов" и программа закрывалась


Ответы (1 шт):

Автор решения: Amgarak

Вот простой пример: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
→ Ссылка