簡體   English   中英

使用 Python 密碼庫

[英]Working with the Python Cryptographic Library

我正在嘗試將JWT_PUBLICJWT_PRIVATE密鑰功能添加到djangorestframework-jwt 這是文檔中的部分,詳細介紹了如何使用它:

Django REST 框架 JWT 公鑰和私鑰

首先,我有以下內容:

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

瀏覽了文檔后,我對具體要求我做什么/改變一無所知。

所以,我的問題是/是:

1.) 我們如何使用這個 package 的JWT_PUBLIC_KEYJWT_PRIVATE_KEY功能?

2.) “ Can't instantiate abstract class X with abstract methods ”在 Python 上下文中的實際含義是什么?

非對稱加密(即擁有公鑰和私鑰)不同於對稱加密(即只有一個密鑰)。 您不能(通常)從密碼中派生非對稱(公鑰/私鑰)密鑰對,您必須使用 openssl 之類的內容生成它們

這些文檔看起來也不正確,代碼只是將私鑰和公鑰傳遞給 PyJWT ,而 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()

我在 function 中這樣做,這樣它就不會過多地污染您的配置命名空間

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM