微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ed25519 的 alg 值?

如何解决Ed25519 的 alg 值?

RFC7518 在 JWT 中使用了 list of algorithms values。但是,EdDSA 没有值,例如 Ed25519。此外,在 Jose 中进行验证时,Ed25519 不被接受为有效值。 Ed25519 的正确 alg 值是多少?

解决方法

ED25519 是 EdDSA (Edwards-curve DSA) 签名方案。另请参阅 RFC8037RFC8032

根据jose documentation alg 需要设置为EdDSA

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

EdDSA 也列在 IANA 注册表的 section JSON Web Signature and Encryption Algorithms 中(感谢 @Florent Morselli 的提示)


这里我展示了一个示例,如何在 Node.js 中使用 jose 和加密生成 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"
}

在 Python 中使用 PyJWT 验证令牌:

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 算法,因此您无法在该网站上验证令牌。我也不知道有任何其他 JWT 网站可以验证 EdDSA 签名的令牌。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?