FastAPI開發基礎之python-jose

簡介

python-jose是Python版本的JOSE實現。“JOSE”意思是JavaScript對象簽名和加密(JavaScript Object Signing and Encryption)技術,這個庫中包含了如下4個子庫:

  • JSON Web簽名(JWS)
  • JSON Web加密(JWE)
  • JSON Web密鑰(JWK)
  • JSON Web算法(JWA)
    上述各子庫,可以共同用於使用各種算法對內容進行加密和/或簽名。雖然所有這些庫顯得格外龐大,甚至可能會令一些人望而生畏,但預計大多數應用程序將只使用其中的小部分算法即可滿足業務需求。
    【注意】這個Python版本的JOSE實現與依賴於PyCrypto庫的Google App Engine完全兼容。

    安裝

    pip install python-jose[cryptography]

    後端加密類型

    從3.1.0版本開始,python實現了四種不同的後端加密類型。因此,安裝python-jose時,應當確定一下選擇安裝哪一種類型的後端。如果不選擇哪一種類型,則默認安裝native-python後端。除非另有說明;否則,所有後端類型都支持所有操作。
    【注意】由於安裝工具的複雜性,總會安裝native-python這種後端類型——即使你安裝時選擇了不同的後端也是如此。但是,在部署項目時我們建議你刪除其中不必要的依賴項。

    1. cryptography

    此後端對所有加密操作都使用pyca/cryptography。這也是推薦的後端類型,如果存在任何其他後端類型的話,這種類型是推薦優先於所有其他後端類型使用的。
    安裝命令:pip install python-jose[cryptography]
    選擇此類型時,未使用的依賴項有:



  • rsa
  • ecdsa
  • pyasn1

    2. pycryptodome

    這種後端使用pycryptome進行所有加密操作。
    安裝命令:pip install python-jose[pycryptodome]
    選擇此類型時,未使用的依賴項有:

  • rsa

    3. native-python

    此後端使用python-rsa和python-ecdsa執行所有加密操作。此後端類型將始終安裝,但如果安裝了任何其他後端,則將優先安裝使用其他後端。
    安裝命令:pip install python-jose
    【注意】native-python後端類型無法處理證書問題。

    4. pycrypto

    此後端使用pycrypto執行所有加密操作。
    安裝命令:pip install python-jose[pycrypto]
    選擇此類型時,未使用的依賴項有:

  • rsa
    【警告】pycrypto項目自2013年以來一直未得到維護。此後端僅出於與舊版兼容性的目的而維護。除非不能使用其他任何後端,否則不要使用此後端。

    舉例

    例1:JSON Web令牌(JWT)編解碼

    from jose import jwt
    token = jwt.encode({'key': 'value'}, 'secret', algorithm='HS256')
    u'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ2YWx1ZSJ9.FG-8UppwHaFp1LgRYQQeS6EDQF7_6-bMFegNucHjmWg'


jwt.decode(token, 'secret', algorithms=['HS256'])
{u'key': u'value'}

例2:使用JWS簽名令牌和驗證令牌簽名

簽名令牌:
from jose import jws
signed = jws.sign({'a': 'b'}, 'secret', algorithm='HS256')
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhIjoiYiJ9.jiMyrsmD8AoHWeQgmxZ5yq8z0lXS67_QGs52AzC8Ru8'
驗證令牌簽名:
jws.verify(signed, 'secret', algorithms=['HS256'])
{'a': 'b'}





例3:使用JWK驗證令牌簽名

from jose import jwk
from jose.utils import base64url_decode

token = "eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9.SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4.s0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0"
hmac_key = {
"kty": "oct",
"kid": "018c0ae5-4d9b-471b-bfd6-eef314bc7037",
"use": "sig",
"alg": "HS256",
"k": "hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg"
}






key = jwk.construct(hmac_key)

message, encoded_sig = token.rsplit('.', 1)
decoded_sig = base64url_decode(encoded_sig)
key.verify(message, decoded_sig)
【注意】python-jose需要使用公鑰,而不是X.509證書。如果您有一個X.509證書,您想將其轉換爲python-jose可以使用的公鑰,那麼可以使用openssl來實現,方式如下:
openssl x509 -pubkey -noout < cert.pem



例4:使用JWE加密

JSON Web加密(JWE)用於加密“有效負載”(真正要加密的內容),並將其表示爲緊湊的URL安全字符串。
加密“有效負載”代碼:
from jose import jwe
jwe.encrypt('Hello, World!', 'asecret128bitkey', algorithm='dir', encryption='A128GCM')
'eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4R0NNIn0..McILMB3dYsNJSuhcDzQshA.OfX9H_mcUpHDeRM4IA.CcnTWqaqxNsjT4eCaUABSg'
解密“有效負載”代碼:
from jose import jwe
jwe.decrypt('eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4R0NNIn0..McILMB3dYsNJSuhcDzQshA.OfX9H_mcUpHDeRM4IA.CcnTWqaqxNsjT4eCaUABSg', 'asecret128bitkey')
'Hello, World!'







參考

https://python-jose.readthedocs.io/en/latest/
https://github.com/mpdavis/python-jose

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章