Работа с криптографической библиотекой Python - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь добавить функциональность клавиш JWT_PUBLIC и JWT_PRIVATE к djangorestframework-jwt. Это раздел в документации, который дает подробные сведения о том, как его использовать:

Django REST Framework JWT Public & Private Key

Для начала у меня есть следующее:

from cryptography.hazmat.primitives.asymmetric.rsa import RSAPublicKey, RSAPrivateKey

JWT_SECRET_KEY = 'supercrazysecretjwtstringwowamazing'

JWT_PUBLIC_KEY = RSAPublicKey().encrypt(JWT_SECRET_KEY)

JWT_PRIVAT_KEY = RSAPrivateKey().encrypt(JWT_SECRET_KEY)

Однако я получаю следующую ошибку:

TypeError: Can't instantiate abstract class RSAPublicKey with abstract methods encrypt, key_size, public_bytes, public_numbers, verifier, verify

Просматривая документацию, я не знаю, что конкретно просит меня сделать/change.

Итак, мой вопрос (ы):

1.) Как мы используем функциональность JWT_PUBLIC_KEY и JWT_PRIVATE_KEY этого пакета?

2.) Что на самом деле означает " Не может создать экземпляр абстрактного класса X с абстрактными методами " в контексте Python?

1 Ответ

0 голосов
/ 29 октября 2019

асимметричное крипто (то есть имеющее открытый и закрытый ключи) отличается от симметричного крипто (то есть просто имеющего один секретный ключ). вы не можете (обычно) получить асимметричную (открытый / закрытый) пару ключей из ключевой фразы, вы должны сгенерировать их с помощью чего-то вроде openssl

эти документы также выглядят некорректно, код просто пропускает закрытые и открытые ключи PyJWT , которые, в свою очередь, ожидают строки

для решения вашей проблемы:

  1. запускается генерацией пары ключей и извлекая общедоступную часть в отдельный файл
  2. измените вашу конфигурацию на что-то вроде:
JWT_ALGORITHM = 'RS256'
JWT_PUBLIC_KEY = open('public.pem').read()
JWT_PRIVATE_KEY = open('private.pem').read()

и все будет работать!

выглядит такЯ неправильно прочитал код, вы можете загрузить ключи с чем-то вроде:

def load_rsa_private_key(path):
    from cryptography.hazmat.backends import default_backend
    from cryptography.hazmat.primitives import serialization

    with open(path, 'rb') as priv:
        private_key = serialization.load_pem_private_key(
            priv.read(), password=None, backend=default_backend())

    return private_key

JWT_PRIVATE_KEY = load_rsa_private_key('keypair.pem')
JWT_PUBLIC_KEY = JWT_PRIVATE_KEY.public_key()

Я делаю это в функции, чтобы она не слишком сильно загрязняла пространство имен вашей конфигурации

...