3

RFC7518 有一个JWT 中使用的算法值列表。但是 没有任何价值EdDSA,例如Ed25519。在Ed25519Jose 中验证时也不接受作为有效值。什么是正确的 alg 值Ed25519

4

1 回答 1

3

ED25519 是 EdDSA(爱德华兹曲线 DSA)签名方案。另请参阅RFC8037RFC8032

根据jose 文档 alg需要设置为EdDSA

JWS 算法:爱德华兹曲线 DSA 算法
:EdDSA

EdDSA也列在 IANA 注册表的JSON Web 签名和加密算法部分中(感谢@Florent Morselli 的提示)


在这里,我展示了一个示例,如何在 Node.js 中使用jose和 crypto 生成 ed25519 密钥对和签名令牌,然后在 Python 中使用公钥验证令牌:

生成密钥对和令牌:

const { SignJWT } = require('jose/jwt/sign')
const { generateKeyPairSync } = require('crypto')

const { publicKey, privateKey } = generateKeyPairSync('ed25519');
console.log(publicKey.export({format:'pem',type:'spki'}))
console.log(privateKey.export({format:'pem',type:'pkcs8'}))

const jwt = await new SignJWT({ 'id': 1 })
    .setProtectedHeader({ alg: 'EdDSA' })
    .setExpirationTime('2h')
    .sign(privateKey)

console.log(jwt)

-----开始公钥-----
MCowBQYDK2VwAyEA7fySb/9h7hVH8j1paD5IoLfXj4prjfNLwOPUYKvsTOc=
-----结束公钥-----

-----开始私钥-----
MC4CAQAwBQYDK2VwBCIEIIJtJBnTuKbIy5YjoNiH95ky3DcA3kRB0I2i7DkVM6Cf
-----结束私钥-----

eyJhbGciOiJFZERTQSJ9.eyJpZCI6MX0.RAxBAQPFOxrCfgqb56eaAz9u2lByj-WEO- JWgJH3Cyx1o1Hwjn1pA2M4NgJeob9vb2Oaw4FOeYFr6_33XMTnAQ

解码的令牌头:


{
  "alg": "EdDSA"
}

使用PyJWT在 Python 中验证令牌:

import jwt

public_key = """-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEA7fySb/9h7hVH8j1paD5IoLfXj4prjfNLwOPUYKvsTOc=
-----END PUBLIC KEY-----"""

token = 'eyJhbGciOiJFZERTQSJ9.eyJpZCI6MX0.RAxBAQPFOxrCfgqb56eaAz9u2lByj-WEO-JWgJH3Cyx1o1Hwjn1pA2M4NgJeob9vb2Oaw4FOeYFr6_33XMTnAQ'

decoded = jwt.decode(token, public_key, algorithms='EdDSA', verify=True)
print(decoded)   

注意: jwt.io目前不支持 EdDSA/ED25519 算法,因此您无法在该站点上验证令牌。我也不知道任何其他可以验证 EdDSA 签名令牌的 JWT 网站。

于 2021-03-31T19:22:08.380 回答