java:使用BouncyCastle验证Ed25519签名未按预期工作
不幸的是,我还没有找到谷歌的答案,所以我想我还是问问吧 我正在尝试编写一个服务库,用于向客户端发送消息、时间戳和签名,其中签名应该是java:使用BouncyCastle验证Ed25519签名未按预期工作,java,bouncycastle,ed25519,Java,Bouncycastle,Ed25519,不幸的是,我还没有找到谷歌的答案,所以我想我还是问问吧 我正在尝试编写一个服务库,用于向客户端发送消息、时间戳和签名,其中签名应该是sign(privkey,timestamp+message),而消息是原始JSON。我的验证尝试如下所示: public boolean validate(String pubkey, String signature, String timestamp, String message) throws Exception { final var provi
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));
}
我已经尝试了我的验证方法,例如,来自的示例代码,它运行良好;特别是只有在“真实”数据的情况下,它才会失败。我很困惑为什么会发生这种情况,如果有任何建议,我将不胜感激。事实证明,我使用的服务只是向我发送了格式错误的数据;我的代码实际上是正确的,但该服务大部分时间只是向我发送无效数据。结果表明,我使用的服务只是向我发送格式错误的数据;我的代码实际上是正确的,但大多数时候服务只是向我发送无效数据。如果代码在原则上有效,那么签名的工作方式可能与您想象的不同。您能否发布用于签名的代码和示例数据:私钥、公钥、时间戳、消息和签名?如果代码在原则上有效,那么签名的工作方式可能与您想象的不同。您可以发布用于签名的代码和示例数据:私钥、公钥、时间戳、消息和签名吗?