python-jose是Python版本的JOSE實現。「JOSE」意思是JavaScript對象簽名和加密(JavaScript Object Signing and Encryption)技術,這個庫中包含了以下4個子庫:python
pip install python-jose[cryptography]git
從3.1.0版本開始,python實現了四種不一樣的後端加密類型。所以,安裝python-jose時,應當肯定一下選擇安裝哪種類型的後端。若是不選擇哪種類型,則默認安裝native-python後端。除非另有說明;不然,全部後端類型都支持全部操做。
【注意】因爲安裝工具的複雜性,總會安裝native-python這種後端類型——即便你安裝時選擇了不一樣的後端也是如此。可是,在部署項目時咱們建議你刪除其中沒必要要的依賴項。github
此後端對全部加密操做都使用pyca/cryptography。這也是推薦的後端類型,若是存在任何其餘後端類型的話,這種類型是推薦優先於全部其餘後端類型使用的。
安裝命令:pip install python-jose[cryptography]
選擇此類型時,未使用的依賴項有:算法
這種後端使用pycryptome進行全部加密操做。
安裝命令:pip install python-jose[pycryptodome]
選擇此類型時,未使用的依賴項有:後端
此後端使用python-rsa和python-ecdsa執行全部加密操做。此後端類型將始終安裝,但若是安裝了任何其餘後端,則將優先安裝使用其餘後端。
安裝命令:pip install python-jose
【注意】native-python後端類型沒法處理證書問題。安全
此後端使用pycrypto執行全部加密操做。
安裝命令:pip install python-jose[pycrypto]
選擇此類型時,未使用的依賴項有:dom
from jose import jwt
token = jwt.encode({'key': 'value'}, 'secret', algorithm='HS256')
u'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ2YWx1ZSJ9.FG-8UppwHaFp1LgRYQQeS6EDQF7_6-bMFegNucHjmWg'ide
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_decodetoken = "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