# DRF Rack # Библиотека классов расширений для Django REST Framework # # Автор: Николай В. Анохин # Все права защищены. Лицензия: MIT """ Работа с криптографией """ import secrets class Crypto: """ Реализует методы работы со случайными и криптографическими значениями """ DEFAULT_TOKEN_LENGTH = 32 """ Длина токена по умолчанию """ DEFAULT_PIN_CODE_LENGTH = 4 """ Длина PIN-кода по умолчанию """ DEFAULT_PIN_CODE_ALPHABET = "0123456789" """ Алфавит PIN-кода по умолчанию """ DEFAULT_SLUG_LENGTH = 8 """ Длина slug по умолчанию """ @classmethod def gen_token(cls, length: int = DEFAULT_TOKEN_LENGTH) -> str: """ Генерирует случайный токен :param length: Длина токена :return: Сгенерированный токен """ bytes_needed = (length + 1) // 2 token = secrets.token_hex(bytes_needed) return token[:length] @classmethod def gen_pin_code(cls, length: int = DEFAULT_PIN_CODE_LENGTH, alphabet: str = DEFAULT_PIN_CODE_ALPHABET): """ Генерирует случайный PIN-код :param length: Длина PIN-кода :param alphabet: Алфавит PIN-кода :return: Сгенерированный PIN-код """ return "".join(secrets.choice(alphabet) for _ in range(length)) @classmethod def gen_slug(cls, prefix: str, length: int = DEFAULT_SLUG_LENGTH): """ Генерирует случайный slug :param prefix: Префикс slug :param length: Длина slug :return: Сгенерированный slug """ l = length - len(prefix) if l <= 0: return prefix return prefix + cls.gen_token(l)