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