java:使用 BouncyCastle 验证 Ed25519 签名未按预期工作
java: Verifying Ed25519 signature with BouncyCastle not working as expected
不幸的是,我没有找到 Google 的答案,所以我想我也可以问一下。
我正在尝试编写用于发送客户端消息、时间戳和签名的库的服务,其中签名应该是 sign(privkey, timestamp + message)
,消息是原始的 JSON .我的验证尝试如下所示:
public boolean validate(String pubkey, String signature, String timestamp, String message) throws Exception {
final var provider = new BouncyCastleProvider();
Security.addProvider(provider);
final var byteKey = Hex.decodeHex(pubkey);
final var pki = new SubjectPublicKeyInfo(new AlgorithmIdentifier(EdECObjectIdentifiers.id_Ed25519), byteKey);
final var pkSpec = new X509EncodedKeySpec(pki.getEncoded());
final var kf = KeyFactory.getInstance("ed25519", provider);
final var publicKey = kf.generatePublic(pkSpec);
final var signedData = Signature.getInstance("ed25519", provider);
signedData.initVerify(publicKey);
signedData.update(timestamp.getBytes());
signedData.update(message.getBytes());
return signedData.verify(Hex.decodeHex(signature));
}
我已经用 ex 尝试了我的验证方法。来自 this issue 的示例代码,它工作正常;特别是只有“真实”数据失败了。我很困惑为什么会发生这种情况,希望得到任何建议。
原来我使用的服务只是向我发送格式错误的数据;我的代码实际上是正确的,但大多数时候该服务只是向我发送无效数据。
不幸的是,我没有找到 Google 的答案,所以我想我也可以问一下。
我正在尝试编写用于发送客户端消息、时间戳和签名的库的服务,其中签名应该是 sign(privkey, timestamp + message)
,消息是原始的 JSON .我的验证尝试如下所示:
public boolean validate(String pubkey, String signature, String timestamp, String message) throws Exception {
final var provider = new BouncyCastleProvider();
Security.addProvider(provider);
final var byteKey = Hex.decodeHex(pubkey);
final var pki = new SubjectPublicKeyInfo(new AlgorithmIdentifier(EdECObjectIdentifiers.id_Ed25519), byteKey);
final var pkSpec = new X509EncodedKeySpec(pki.getEncoded());
final var kf = KeyFactory.getInstance("ed25519", provider);
final var publicKey = kf.generatePublic(pkSpec);
final var signedData = Signature.getInstance("ed25519", provider);
signedData.initVerify(publicKey);
signedData.update(timestamp.getBytes());
signedData.update(message.getBytes());
return signedData.verify(Hex.decodeHex(signature));
}
我已经用 ex 尝试了我的验证方法。来自 this issue 的示例代码,它工作正常;特别是只有“真实”数据失败了。我很困惑为什么会发生这种情况,希望得到任何建议。
原来我使用的服务只是向我发送格式错误的数据;我的代码实际上是正确的,但大多数时候该服务只是向我发送无效数据。