使用Dart中的Ed25519算法生成JWS (json web签名)



我想用通过Ed25519生成的私钥签名json web签名。然后将此签名发送到我的后端,并使用Node.js中的公钥进行验证。目前我卡在创建json web签名与Dart。
privateKey是base58编码的,所以我首先将其解码为如下所示的整数列表:

String generateJwt(String subject, String secret) {
var decodedRaw = Base58Decode(secret);
print(decodedRaw);
/* [208, 105, 206, 135, 43, 101, 101, 250, 227, 
140, 174, 15, 170, 99, 69, 156, 193, 74, 234, 
158, 136, 83, 124, 133, 190, 248, 205, 196, 
217, 126, 164, 196] */
final payload = {"id": subject};
}

现在我想使用有效载荷作为JWS的有效载荷,并通过我的Ed25519解码的私钥保护头。这是在Node.js中用jose创建的jwt的格式:

{
payload: { subject: 'uuid', exp: 1627901626 },
protectedHeader: { alg: 'EdDSA' }
}

我的目标是用Dart在本地设备上创建相同格式的JWS。

编辑:
我现在找到了dart_jsonwebtoken包,它可以使用Ed25519曲线算法签署jsonweb令牌。

import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';
import 'package:fast_base58/fast_base58.dart';
generateJwt(String subject, String secret) {
final decodedRaw = Base58Decode(secret);
// Create a json web token
final jwt = JWT(
{
'subject': subject,
},
issuer: subject,
);
final key = EdDSAPrivateKey(decodedRaw);
final token = jwt.sign(key, algorithm: JWTAlgorithm.EdDSA);
print('Signed token: $tokenn');
}

但我现在得到错误:ed25519: bad privateKey length 32。这显然表明我的私钥有错误的大小。Repo声明PrivateKeySize是64字节,但是是否有一种方法可以只使用32字节的私钥,因为通过Ed25519生成的密钥总是32字节

/// PublicKeySize is the size, in bytes, of public keys as used in this package.
const PublicKeySize = 32;
/// PrivateKeySize is the size, in bytes, of private keys as used in this package.
const PrivateKeySize = 64;

所需的64字节密钥是通过连接私钥和公钥产生的:

发布的私钥是十六进制编码的:

d069ce872b6565fae38cae0faa63459cc14aea9e88537c85bef8cdc4d97ea4c4

对应的公钥没有发布,但可以计算为(十六进制编码):

5067025e39f7628f60c91c178287b28446b34a752579e709dcb1ad1ac8dc6401

因此所需的64字节密钥是(十六进制编码):

d069ce872b6565fae38cae0faa63459cc14aea9e88537c85bef8cdc4d97ea4c45067025e39f7628f60c91c178287b28446b34a752579e709dcb1ad1ac8dc6401

或Base58编码:

5AgHMMkzfDxdAHHHmpqjQYLqaKnrXTddWGpMQW8Dsj4391Fm7G79ZutmKwZousSvUWbYsf1W8Q12RAMFjXjDcDs6

一个可能由:

生成的JWT
generateJwt('the subject', '5AgHMMkzfDxdAHHHmpqjQYLqaKnrXTddWGpMQW8Dsj4391Fm7G79ZutmKwZousSvUWbYsf1W8Q12RAMFjXjDcDs6');

:

eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJzdWJqZWN0IjoidGhlIHN1YmplY3QiLCJpYXQiOjE2MjgwMTkyNDIsImlzcyI6InRoZSBzdWJqZWN0In0.17gFglAs7g8ztBTDsfIx7B6l1GFkbI96xezX6g53lEvoy9HfNqT1wc8MApa8uA1muLDU4MWiwgmpwO51beZDBw

一个简单的测试是验证消息:

eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJzdWJqZWN0IjoidGhlIHN1YmplY3QiLCJpYXQiOjE2MjgwMTkyNDIsImlzcyI6InRoZSBzdWJqZWN0In0

和它的签名:

17gFglAs7g8ztBTDsfIx7B6l1GFkbI96xezX6g53lEvoy9HfNqT1wc8MApa8uA1muLDU4MWiwgmpwO51beZDBw

使用Ed25515和第二个独立程序。我使用c#/BouncyCastle成功地验证了这一点。

最新更新