Skip to content

Jwa介绍

JSON Web Algorithms for JWS(JWS 签名算法)

定义 JWS Header 的“alg”(算法)参数值

下表是一组“alg”(算法)Header Parameter rfc7518规范定义的用于 JWS 的值,每个值在以下有更详细的解释

alg 的值算法数字签名或 MAC要求
HS256HMAC 使用 SHA-256必须
HS384HMAC 使用 SHA-384可选
HS512HMAC 使用 SHA-512可选
RS256RSASSA-PKCS1-v1_5 使用 SHA-256推荐
RS384RSASSA-PKCS1-v1_5 使用 SHA-384可选
RS512RSASSA-PKCS1-v1_5 使用 SHA-512可选
ES256使用 P-256 和 SHA-256 的 ECDSA推荐+
ES384使用 P-384 和 SHA-384 的 ECDSA可选
ES512使用 P-521 和 SHA-512 的 ECDSA可选
PS256使用SHA-256的RSASSA-PPS和使用SHA-256的MGF1可选
PS384使用SHA-384的RSASSA-PPS和使用SHA-384的MGF1可选
PS512使用SHA-512的RSASSA-PPS和使用SHA-512的MGF1可选
none没有数字签名或 MAC可选

HS256 ES384 ES512

要求使用 具有SHA-2功能的HMAC

HMAC算法

HMAC算法简介

HMAC(Hash-based Message Authentication Code,散列消息认证码)是一种使用密码散列函数,同时结合一个加密密钥,通过特别计算方式之后产生的消息认证码(MAC)。它可以用来保证数据的完整性,同时可以用来作某个消息的身份验证。 HMAC算法 是一种基于密钥的报文完整性的验证方法。HMAC算法利用哈希运算,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。其安全性是建立在Hash加密算法基础上的。它要求通信双方共享密钥、约定算法、对报文进行Hash运算,形成固定长度的认证码。通信双方通过认证码的校验来确定报文的合法性。HMAC算法可以用来作加密、数字签名、报文验证等。

HMAC算法定义

HMAC算法的数学公式为: HMAC(k,m)=H(k’?opad,H(k’?ipad,m))

  • H 为密码Hash函数(如MD5或SHA-2),能够对明文进行分组循环压缩;
  • k 为密钥(secret key);
  • m 为要认证的消息;
  • k’ 是从原始密钥 k 导出的另一个密钥(如果 k 短于散列函数的输入块大小,则向右填充零;如果比该块大小更长,则对 k 进行散列)
  • ipad 内部填充(0x5C5C5C…5C5C,一段十六进制常量);
  • opad 外部填充(0x363636…3636,一段十六进制常量)

HMAC算法步骤

  1. 在密钥k后面添加0,或者对密钥k用H(Hash函数)进行处理,创建一个字长为B的字符串(B为Hash函数的明文分组长度);
  2. 将上一步生成的B字长的字符串ipad做异或运算;
  3. 将数据流m填充至第二步的结果字符串中;
  4. 用H作用于第三步生成的数据流;
  5. 将第一步生成的B字长字符串与opad做异或运算;
  6. 再将第四步的结果填充进第五步的结果中;
  7. 用H作用于第六步生成的数据流,输出最终结果。

JWA HMAC使用规范

基于散列的消息认证代码 (HMAC) 使用 secret 加上加密哈希函数以生成 MAC。这可用于证明生成 MAC 的人在 拥有MAC密钥。算法实现规范 [RFC2104] 中提供了验证 HMAC。

与散列输出大小相同的密钥(例如,256 位"HS256") 或更大的值必须与此算法一起使用。(这 其中指出有效安全强度是安全强度的最小值 密钥的大小和内部哈希值大小的两倍。

HMAC SHA-256 MAC 是根据 RFC2104 生成的,使用 SHA-256 作为哈希算法“H”,使用 JWS 签名输入作为“text”值, 并使用密钥。HMAC输出值就是JWS 签名。

== RS256 RS384 RS512 RSASSA-PKC1-v1_5数字签名

RSASSA-PKCS1-v1_5 数字的使用 [RFC3447] 第 8.2 节中定义的签名算法(通常称为 PKCS #1),使用 SHA-2 [SHS] 哈希函数。这些算法必须使用大小为 2048 位或更大的密钥。

RSASSA-PKCS1-v1_5 SHA-256 数字签名生成为如下:

使用生成 JWS 签名输入的数字签名 RSASSA-PKCS1-v1_5-SIGN 和具有所需的 SHA-256 哈希函数私钥。这是 JWS Signature值。

验证如下: 提交 JWS 签名输入,JWS 签名,以及使用的私钥对应的公钥 由签名者使用 SHA-256 传递给 RSASSA-PKCS1-v1_5-VERIFY 算法 作为哈希函数。

提交 JWS 签名输入,JWS签名,以及使用的私钥对应的公钥由签名者使用 SHA-256 传递给 RSASSA-PKCS1-v1_5-VERIFY 算法作为哈希函数。

ES256 ES384 ES512

椭圆曲线数字签名算法 (ECDSA) [DSS] 提供用于使用椭圆曲线密码术,它能够提供 与 RSA 密码术等效的安全性,但使用更短的密钥大小 许多操作的处理速度更快。这意味着 ECDSA 数字签名将大大减少长度比同等强度的 RSA 数字签名。 JWA规范 ECDSA 与 P-256 曲线的使用,以及SHA-256 加密哈希函数,ECDSA 与 P-384 曲线 和 SHA-384 哈希函数,以及 ECDSA 与 P-521 曲线和SHA-512 哈希函数。P-256、P-384 和 P-521 曲线是 [DSS] 中定义。

ECDSA P-256 SHA-256 数字签名生成如下:

  • 使用 ECDSA 生成 JWS 签名输入的数字签名具有所需私钥的 P-256 SHA-256。输出将是 (R, S) 对,其中 R 和 S 是 256 位无符号整数。
  • 将 R 和 S 转换为大端顺序的八位字节序列,每个数组长度为 32 个八位字节。八位位组序列不得缩短表示以省略任何前导零值中包含的八位字节。
  • 按照 R 和 S 的顺序连接两个八位位组序列。(请注意,许多 ECDSA 实现将直接生成此串联作为它们的输出。)
  • 生成的 64 字节序列是 JWS signature 值。

PS256 PS384 PS512

RSASSA-PSS 数字签名的使用[RFC3447] 第 8.1 节中定义的算法MGF1 掩码生成函数和 SHA-2 哈希函数,始终使用 RSASSA-PSS 哈希函数和MGF1 哈希函数。盐值的大小与哈希函数输出。所有其他算法参数使用RFC 3447 的附录 A.2.3 中指定的默认值。此算法必须使用大小为 2048 位或更大的密钥。

RSASSA-PSS SHA-256 数字签名生成如下: 使用 RSASSA- 生成 JWS 签名输入的数字签名PSS-SIGN、SHA-256 哈希函数和 MGF1 掩码生成使用所需私钥的 SHA-256 函数。这是 JWS签名值。

none

使用算法“none”也可以创建不提供完整性保护的 JWS。 这样的 JWS 称为不安全的 JWS。不安全的 JWS 使用 “alg”值为“none”并且格式与其他 JWS 相同,但是必须使用空八位字节序列作为其 JWS 签名值。 支持不安全 JWS 的实现绝不能接受这样的对象为有效,除非应用程序指定它是 特定对象不受完整性保护是可以接受的。 默认情况下,实现不得接受不安全的 JWS。为了 为了减轻降级攻击,应用程序不得发出信号 在全球范围内接受不安全的 JWS,并且应该发出信号在每个对象的基础上验收。

JSON Web Algorithms for JWE(JWE 加密算法)

定义 JWE Header 的“alg”(算法)参数值

alg 参数的值密钥管理算法更多Header参数要求
RSA1_5RSAES-PKCS1-v1_5(none)推荐+
RSA-OAEPC使用默认参数的RSAES OAEP(none)推荐+
RSA-OAEP-256RSAES OAEP(使用SHA-256)和MGF1(使用SHA-25 6)(none)可选
A128KW128位密钥使用默认初始值进行AES密钥换行(none)推荐
A192KW192位密钥使用默认初始值进行AES密钥换行(none)可选
A256KW256位密钥使用默认初始值进行AES密钥换行(none)推荐
dir直接使用共享对称密钥作为CEKnone推荐
ECDH-ES使用Concat KDF的椭圆曲线Diffie-Hellman短暂静态密钥协商"epk", "apu","apv"推荐+
ECDH-ES+A128KW使用“A128KW”包裹的凹形KDF和CEK的ECD-ES"epk", "apu","apv"推荐
ECDH-ES+A192KW使用“A192KW”包裹的凹形KDF和CEK的ECD-ES"epk", "apu","apv"可选

RFC 7518 JSON Web算法(JWA)

alg 参数的值密钥管理算法更多Header参数要求
ECDH-ES+A256KW使用“A256KW”包裹的凹形KDF和CEK的ECD-ES"epk", "apu","apv"推荐
A128GCMKW使用128位密钥的AES GCM密钥包装"iv","tag"可选
A192GCMKW使用192位密钥的AES GCM密钥包装"iv","tag"可选
A256GCMKW使用256位密钥的AES GCM密钥包装"iv","tag"可选
PBES2-HS256+A128KWPBES2,带HMAC SHA-256和“A128KW”包装"p2s","p2c"可选
PBES2-HS384+A192KWPBES2,带HMAC SHA-384和“A192KW”包装"p2s","p2c"可选
PBES2-HS512+A256KWPBES2,带HMAC SHA-512和“A256KW”包装"p2s","p2c"可选

Header 参数 说明

  • “epk”(临时公钥)Header 参数
  • “apu”(协议 PartyUInfo)Header 参数
  • “apv”(协议方VInfo)Header 参数
  • enc ASCII 表示的八位字节Header 参数。在与 Key Wrapping 的密钥协议中 情况下,数据设置为 ASCII 表示的八位字节“alg”(算法)标头参数值。
  • “iv”(初始化向量)Header 参数值。 IV 以 base64url 编码形式表示
  • “alg” 表明JWE Encrypted Key是加密的结果CEK使用相应的算法和密钥大小:
  • "tag" (Authentication Tag) 128 位身份验证标记的 base64url 编码表示密钥加密操作产生的值
  • “p2s”(PBES2 盐输入)Header 参数
  • “p2c”(PBES2 计数)Header参数

JWE 的“enc”(加密算法)Header参数值

“enc” 参数 的值内容加密算法
A128CBC-HS256AES_128_CBC_HMAC_SHA_256
A192CBC-HS384AES_192_CBC_HMAC_SHA_384
A256CBC-HS512AES_256_CBC_HMAC_SHA_512
A128GCM使用 128 位密钥的 AES GCM
A192GCM使用 192 位密钥的 AES GCM
A256GCM使用 256 位密钥的 AES GCM

“kty”(密钥类型)参数值

kty 参数的值Key Type
ECElliptic Curve [DSS]
RSARSA [RFC3447]
oct八进制序列(用于表示对称密钥)
曲线
  • “crv”(曲线)参数 “P-256” “P-384” “P-521”
  • “x”(X 坐标)参数
  • “y”(Y 坐标)参数
  • “d”(ECC 私钥)参数

RSA 密钥的参数

  • “kty”值为“RSA”
  • “n”(模数)参数
  • “e”(指数)参数
  • “d”(私有指数)参数
  • “p”(第一素数)参数
  • “q”(第二素数)参数
  • “dp”(第一因子 CRT 指数)参数
  • “dq”(第二因子 CRT 指数)参数
  • “qi”(第一个 CRT 系数)参数
  • “oth”(其他素数信息)参数
    • “r”(素数)
    • “d”(因子 CRT 指数)
    • “t”(因子 CRT 系数)
  • “k”(键值)参数

版权声明