К сожалению, я не нашел ответа в 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. пример кода из этого выпуска, и он отлично работает; конкретно только с «реальными» данными это не удается. Я сбит с толку, почему это происходит, и был бы признателен за любой совет.
Оказалось, что служба, которую я использовал, просто отправляла мне искаженные данные; мой код был на самом деле правильным, но служба большую часть времени просто отправляла мне неверные данные.
Если код работает в принципе, то подпись может работать не так, как вы подозреваете. Можете ли вы опубликовать код, используемый для подписи, и образцы данных: закрытый ключ, открытый ключ, отметку времени, сообщение и подпись?