Ed25519 的 alg 值?
alg value for Ed25519?
RFC7518 在 JWT 中使用了 list of algorithms values。但是 EdDSA
没有值,例如 Ed25519
。在 Jose 中验证时,Ed25519
也不被接受为有效值。 Ed25519
的正确算法值是多少?
ED25519 是一个 EdDSA (Edwards-curve DSA) signature scheme. See also RFC8037 and RFC8032.
根据jose documentation alg
需要设置为EdDSA
:
JWS Algorithm: Edwards-curve DSA
alg: EdDSA
EdDSA
也列在 IANA 注册表的 section JSON Web Signature and Encryption Algorithms 中(感谢@Florent Morselli 的提示)
这里我展示了一个示例,如何在 Node.js 中使用 jose 和加密生成 ed25519 密钥对和签名令牌,然后使用 public 中的密钥验证令牌 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)
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEA7fySb/9h7hVH8j1paD5IoLfXj4prjfNLwOPUYKvsTOc=
-----END PUBLIC KEY-----
-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEIIJtJBnTuKbIy5YjoNiH95ky3DcA3kRB0I2i7DkVM6Cf
-----END PRIVATE KEY-----
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 网站。
RFC7518 在 JWT 中使用了 list of algorithms values。但是 EdDSA
没有值,例如 Ed25519
。在 Jose 中验证时,Ed25519
也不被接受为有效值。 Ed25519
的正确算法值是多少?
ED25519 是一个 EdDSA (Edwards-curve DSA) signature scheme. See also RFC8037 and RFC8032.
根据jose documentation alg
需要设置为EdDSA
:
JWS Algorithm: Edwards-curve DSA
alg: EdDSA
EdDSA
也列在 IANA 注册表的 section JSON Web Signature and Encryption Algorithms 中(感谢@Florent Morselli 的提示)
这里我展示了一个示例,如何在 Node.js 中使用 jose 和加密生成 ed25519 密钥对和签名令牌,然后使用 public 中的密钥验证令牌 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)
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEA7fySb/9h7hVH8j1paD5IoLfXj4prjfNLwOPUYKvsTOc=
-----END PUBLIC KEY-----
-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEIIJtJBnTuKbIy5YjoNiH95ky3DcA3kRB0I2i7DkVM6Cf
-----END PRIVATE KEY-----
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 网站。