1

不幸的是,我没有找到谷歌的答案,所以我想我不妨问问。

我正在尝试编写用于向客户端发送消息、时间戳和签名的库的服务,其中签名应该是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 尝试了我的验证方法。这个问题的示例代码,它工作正常;特别是只有“真实”数据才会失败。我对为什么会发生这种情况感到困惑,并希望得到任何建议。

4

1 回答 1

0

原来我使用的服务只是向我发送格式错误的数据;我的代码实际上是正确的,但该服务大部分时间只是向我发送无效数据。

于 2020-12-12T18:12:23.007 回答