В 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. Пожалуйста, дайте мне знать, как я могу это исправить.
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 есть примеры использования этих пакетов для распаковки буферных сообщений блочного протокола:
TypeScript — это JavaScript с набором текста, поэтому фактический код должен читаться точно так же, как JavaScript. Конверт имеет два поля: payload
и signature
. signature
— это цифровая подпись payload
. Для проверки подписи вам понадобится открытый ключ подписывающей стороны. Если у вас его еще нет, он содержится в сертификате X.509 подписывающей стороны, как описано выше.
Я не знаком с typeScript. Выполняет ли BlockDecoder.js синтаксический анализ? Если да, то, по вашему мнению, конвертProto.signature может быть проверен на конвертProto.payload?