2016-05-18 89 views
2

我看着python-jose和jose,但似乎都不支持加密已签名的JWT。例如,“jose”库分别支持签名和加密,而不嵌套它们。哪个Python JOSE库支持嵌套JWT(签名+加密)?

我是否错过了一些东西,比如在库之外嵌入JWT可能相当容易?如果是这样,请分享提示,以达到此目的,因此结果格式良好。

+0

你说的嵌套JWTs是什么意思?你是否希望加密的JWE的有效载荷是一个有签名的JWT? –

+0

像这样http://connect2id.com/products/nimbus-jose-jwt/examples/signed-and-encrypted-jwt – Debriter

+0

他们只是在JWT上签名,然后在加密的JWE的负载中使用它。它不是JOSE规范的一部分,所以你需要自己做。 –

回答

1

jwcrypto支持嵌套的JWS和JWE。

要签名,然后加密:

# Load your RSA pub and private keys 
pubKey = jwk.JWK().from_pyca(serializedPublicKey) 
privateKey = jwk.JWK().from_pyca(serializedPrivateKey) 

# your JWT claims go here 
claims = { 
    # JWT claims in JSON format 
      } 
# sign the JWT 
# specify algorithm needed for JWS 
header = { 
      u'alg' : 'RS256', 
      'customSigHeader':'customHeaderContent' 
      } 
# generate JWT 
T = jwt.JWT(header, claims) 
# sign the JWT with a private key 
T.make_signed_token(privateKey) 
# serialize it 
signed_token = T.serialize(compact=True) 

# JWE algorithm in the header 
eprot = { 
    'alg': "RSA-OAEP", 
    'enc': "A128CBC-HS256", 
    'customEncHeader':'customHeaderContent' 
    } 
E = jwe.JWE(signed_token, json_encode(eprot)) 
# encrypt with a public key 
E.add_recipient(pubKey)# 
# serialize it 
encrypted_signed_token = E.serialize(compact=True) 

要解密和验证签名:

#Decrypt and Verify signature 
E = jwe.JWE() 
# deserialize and decrypt 
E.deserialize(encrypted_signed_token, key=privateKey) 
raw_payload = E.payload 
# verify signature 
S = jws.JWS() 
S.deserialize(raw_payload, key=pubKey) 
final_payload = S.payload 
+0

如何从现有字符串(用于AES 128 GCM加密以获得JWE的128位字符串)创建JWK? –