算法

JWS、JWE、JWK 和 JWT 所有可用的算法。


本文档描述了在 JSON Web Signature (JWS)、JSON Web Encryption (JWE) 和 JSON Web Key (JWK) 中使用的算法。

JSON Web Key

JSON Web Key(JWK)的算法包括:

  • OctKey :接受以比特为单位的密钥大小,这意味着 key_size 必须是 8 的倍数。

  • RSAKey :接受以比特为单位的密钥大小,key_size 必须 >=512 且为 8 的倍数。

  • ECKey :接受 crvP-256P-384P-521secp256k1

  • OKPKey :接受 crvEd25519Ed448X25519X448

JSON Web Signature

joserfc.jws 模块支持 RFC7518、RFC8037 和 RFC8812 中的算法。您必须为每个算法指定正确的密钥类型。

算法名

密钥类型

是推荐

none

OctKey

HS256

OctKey

HS384

OctKey

HS512

OctKey

RS256

RSAKey

RS384

RSAKey

RS512

RSAKey

ES256

ECKey

ES384

ECKey

ES512

ECKey

PS256

RSAKey

PS384

RSAKey

PS512

RSAKey

EdDSA

OKPKey

ES256K

ECKey

备注

EdDSA 算法只接受具有 "crv" 为 "Ed25519" 和 "Ed448" 的 OKPKey

JSON Web Encryption

joserfc.jwe 模块支持 RFC7518 中的算法,以及 ECDH-1PU 的草案。您必须为每个算法指定正确的密钥类型。

算法名

密钥类型

是推荐

dir

OctKey

A128KW

OctKey

A192KW

OctKey

A256KW

OctKey

RSA1_5

RSAKey

RSA-OAEP

RSAKey

RSA-OAEP-256

RSAKey

ECDH-ES

ECKey

ECDH-ES+A128KW

ECKey

ECDH-ES+A192KW

ECKey

ECDH-ES+A256KW

ECKey

A128GCMKW

OctKey

A192GCMKW

OctKey

A256GCMKW

OctKey

PBES2-HS256+A128KW

RSAKey

PBES2-HS384+A192KW

RSAKey

PBES2-HS512+A256KW

RSAKey

RFC7518 中定义的所有用于 "enc" 值的算法都是推荐使用的,包括:

  • A128CBC-HS256

  • A192CBC-HS384

  • A256CBC-HS512

  • A128GCM

  • A192GCM

  • A256GCM

RFC7518 还定义了用于 "zip"(压缩)头参数的 DEF 算法,该算法推荐使用。

草案版本中还有针对 "alg" 和 "enc" 的额外算法。请参考以下章节获取更多信息。

OKPKey

对于以下算法,您可以使用 OKPKey 并将 "crv"(曲线)参数设置为 X25519X448

  • ECDH-ES

  • ECDH-ES+A128KW

  • ECDH-ES+A192KW

  • ECDH-ES+A256KW

This allows you to utilize these elliptic curve algorithms with OKPKey for your cryptographic operations.

C20P 与 XC20P

C20PXC20P 算法仍处于草案阶段,默认状态下他们未注册到 JWERegistry。要使用 C20PXC20P,开发人员必须安装 PyCryptodome 模块。

pip install pycryptodome

这是由于 cryptography 库只支持 "ChaCha20" 密码算法,不支持 XChaCha20,而 pycryptodome 同时支持 "ChaCha20" 和 "XChaCha20" 密码算法。

注册密码算法

默认的 注册表 不包含草案算法,开发人员必须先注册 C20PXC20P

from joserfc.drafts.jwe_chacha20 import register_chaha20_poly1305

register_chaha20_poly1305()

自定义注册表 registry

encrypt_compact()decrypt_compact()encrypt_json()decrypt_json() 中使用自定义 registry

from joserfc import jwe
from joserfc.jwk import OctKey

registry = jwe.JWERegistry(
    # add more "alg" and "enc" if you want
    algorithms=["A128KW", "C20P"]
)

key = OctKey.generate_key(128)  # A128KW requires 128 bits key
protected = {"alg": "A128KW", "enc": "C20P"}
encrypted_text = jwe.encrypt_compact(
    protected,
    b"hello",
    public_key=key,
    registry=registry,
)

ECDH-1PU 相关算法

椭圆曲线迪菲-赫尔曼一次通用模型(ECDH-1PU)密钥协商仍然处于草案阶段,默认情况下未注册。要使用与 ECDH-1PU 相关的算法,开发人员必须手动注册它们:

from joserfc.drafts.jwe_ecdh_1pu import register_ecdh_1pu

register_ecdh_1pu()

然后使用带有所需的 ECDH-1PU 算法的自定义 registry。例如:

from joserfc import jwe
from joserfc.jwk import ECKey

registry = jwe.JWERegistry(
    algorithms=["ECDH-1PU+A128KW", "A128CBC-HS256"]
)
protected = {"alg": "ECDH-1PU+A128KW", "enc": "A128CBC-HS256"}
recipient_key = ECKey.import_key("your-ec-public-key.json")
sender_key = ECKey.import_key("your-ec-sender-key.json")  # this SHOULD be a private key
encrypted_text = jwe.encrypt_compact(
    protected,
    b"hello",
    public_key=recipient_key,
    registry=registry,
    sender_key=sender_key,
)

重要

ECDH-1PU 算法需要一个 发送方密钥,在调用 encrypt_compact()encrypt_json() 方法时,该密钥必须是私钥。

sender_key 可以是 KeySet,JWE 会根据 skid 头部值查找正确的密钥。