如何在 python 中创建 JWKS 公钥/私钥对?

Ana*_*lan 7 python cryptography public-key-encryption python-3.x

如何创建 JWKS 公钥/私钥对,类似于可以在https://mkjwk.org/手动创建的密钥对,其中包括密钥 ID ( kid) 和密钥使用( use)?我使用该cryptography模块生成 RSA 密钥对并将python-jose密钥提取为 JWK,但创建的密钥不包括kiduse(毫不奇怪,因为它们没有在任何地方指定)。

\n

代码:

\n
from cryptography.hazmat.backends import default_backend\nfrom cryptography.hazmat.primitives import serialization\nfrom cryptography.hazmat.primitives.asymmetric import rsa\n\xe2\x80\x8b\nfrom jose import jwk, constants\nimport json\n\xe2\x80\x8b\nkey = rsa.generate_private_key(\n    public_exponent=65537,\n    key_size=2048,\n    backend=default_backend()\n)\npublic_key = key.public_key().public_bytes(\n    encoding=serialization.Encoding.PEM,\n    format=serialization.PublicFormat.SubjectPublicKeyInfo\n)\nprivate_key = key.private_bytes(\n    encoding=serialization.Encoding.PEM,\n    format=serialization.PrivateFormat.TraditionalOpenSSL,\n    encryption_algorithm=serialization.NoEncryption()\n)\n\xe2\x80\x8b\nprint(json.dumps(jwk.RSAKey(algorithm=constants.Algorithms.RS256, key=public_key.decode(\'utf-8\')).to_dict()))\nprint(json.dumps(jwk.RSAKey(algorithm=constants.Algorithms.RS256, key=private_key.decode(\'utf-8\')).to_dict()))\n
Run Code Online (Sandbox Code Playgroud)\n

通过上面的代码片段生成的公钥(无kiduse属性):

\n
{\n    "alg": "RS256",\n    "kty": "RSA",\n    "n": "tqbcR_6JC....OKQ",\n    "e": "AQAB"\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Ana*_*lan 10

使用该库生成 JWKS 公钥/私钥对的另一种方法jwcrypto

from jwcrypto import jwk

key = jwk.JWK.generate(kty='RSA', size=2048, alg='RSA-OAEP-256', use='enc', kid='12345')
public_key = key.export_public()
private_key = key.export_private()
Run Code Online (Sandbox Code Playgroud)

通过上面的代码片段生成的公钥:

{
    "kty": "RSA",
    "alg": "RSA-OAEP-256",
    "kid": "12345",
    "use": "enc",
    "e": "AQAB",
    "n": "0YclBn...vV7y7w"
}
Run Code Online (Sandbox Code Playgroud)


sop*_*ros 1

我相信kid这只是一段元数据(任何字符串),在生成密钥的过程中没有使用。

在这种情况下,use它可能有点相似,尽管根据您想要不同的非对称加密方案的用途(您可以参考最著名的RSA非对称加密系统来获取加密和签名方案的描述)。

总而言之,您很可能可以根据上述信息重新创建 JSON 的确切结构,向 JSON 字典添加适当的键。

  • *您分发私钥* - 那么它就不再是私有的了。签名是使用私钥创建并使用公钥验证的。 (2认同)
  • 不确定你在问什么,但关于签名的部分也在维基百科文章中[解释](https://en.wikipedia.org/wiki/RSA_(cryptosystem)#Signing_messages) (2认同)