Получите подпись клиента из блока Hyperledger Fabric и проверьте ее

В Hyperledger Fabric клиент подписывает транзакцию с помощью закрытого ключа. Я пытаюсь найти эту подпись в блоке и проверить подпись, используя открытый ключ клиента.

Код для получения подписи в nodejs:

let getBlockByTX = await blockContract.evaluateTransaction("GetBlockByTxID", channelName, txId);
const resultJson = BlockDecoder.decode(getBlockByTX);
let signaturePRVKey =resultJson.data.data[0].signature;

Вывод:

signaturePRVKey in base64 format
MEUCIQC330iICU/FP1XCIsYIHl4e6ytuS9niir/J7lZ5J5kYegIgF0zvjObCXMnrJfA+QXzIbbuJfJfx0ld+Wv6GknSX3fg=

signaturePRVKey in hex format
3045022100b7df4888094fc53f55c222c6081e5e1eeb2b6e4bd9e28abfc9ee56792799187a0220174cef8ce6c25cc9eb25f03e417cc86dbb897c97f1d2577e5afe86927497ddf8

Я хочу знать, дает ли мне signalPRVKey правильную подпись?

Для проверки подписи (signaturePRVKey) с использованием библиотеки jsrsasign:

const data = [
    "p1","Alice","F","[email protected]","02156874652",
]

var sig = new KJUR.crypto.Signature({ "alg": "SHA256withECDSA" });
sig.init(certificatePEM);

sig.updateString(data)
var isValid = sig.verify(signaturePRVKey)
console.info(isValid)

Проверка signalPRVKey с использованием клиентского сертификата возвращает false. Пожалуйста, дайте мне знать, как я могу это исправить.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

BlockDecoder распаковывает необработанную структуру сообщения буфера протокола блока в простую структуру объекта JavaScript. Результат, который вы получаете от него, не в форме, позволяющей проверить подпись. Имейте в виду, однако, что подпись уже будет проверена как часть процесса отправки транзакции. Если подпись недействительна, транзакция будет отклонена.

Если вы хотите проверить подписи самостоятельно, в исходной структуре сообщения буфера протокола Блока каждый элемент массива data.data Блока представляет собой сериализованные байты Конверта . Конверт содержит свойство signature (которое вы успешно извлекаете) и свойство payload (которое представляет собой сериализованные байты сообщения буфера протокола Payload). signature — это цифровая подпись payload. Это можно проверить с помощью открытого ключа подписывающей стороны.

Также обратите внимание, что сама полезная нагрузка содержит внутри себя SignatureHeader, а свойство creator этого SignatureHeader содержит как идентификатор поставщика услуг для участников (MSP ID) подписывающей стороны, так и их id_bytes, который обычно является X.509 подписывающей стороны. сертификат в формате PEM. Сертификат X.509 содержит открытый ключ подписывающей стороны.

Если вы хотите выполнить эту проверку подписи, вам нужно работать непосредственно с сообщением буфера протокола, возвращаемым GetBlockByTxID, а не с выводом BlockDecoder. Существуют опубликованные пакеты, содержащие сгенерированные языковые привязки для сообщений буфера протокола Fabric, которые можно использовать для этой цели:

https://hyperledger.github.io/fabric-protos/

В образце off_chain_data есть примеры использования этих пакетов для распаковки буферных сообщений блочного протокола:

https://github.com/hyperledger/fabric-samples/blob/main/off_chain_data/application-typescript/src/blockParser.ts

Я не знаком с typeScript. Выполняет ли BlockDecoder.js синтаксический анализ? Если да, то, по вашему мнению, конвертProto.signature может быть проверен на конвертProto.payload?

Mallika 09.12.2022 19:42

TypeScript — это JavaScript с набором текста, поэтому фактический код должен читаться точно так же, как JavaScript. Конверт имеет два поля: payload и signature. signature — это цифровая подпись payload. Для проверки подписи вам понадобится открытый ключ подписывающей стороны. Если у вас его еще нет, он содержится в сертификате X.509 подписывающей стороны, как описано выше.

bestbeforetoday 13.12.2022 13:16

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