Java: проверка подписи Ed25519 с помощью BouncyCastle не работает должным образом

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

Если код работает в принципе, то подпись может работать не так, как вы подозреваете. Можете ли вы опубликовать код, используемый для подписи, и образцы данных: закрытый ключ, открытый ключ, отметку времени, сообщение и подпись?

Topaco 12.12.2020 14:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
878
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказалось, что служба, которую я использовал, просто отправляла мне искаженные данные; мой код был на самом деле правильным, но служба большую часть времени просто отправляла мне неверные данные.

Другие вопросы по теме