Я видел довольно много примеров, когда передаются как данные, так и хэш данных.
Подпись проверяется с помощью ecrecover
чего все в порядке.
Переданный хэш также сверяется с рассчитанным хэшем. Я не вижу, что добавляет эта вторая проверка с точки зрения целостности сообщения и проверки отправителя. Если вычисленный хэш используется для проверки подписи, и он неверен, проверка подписи должна завершиться ошибкой. Я что-то пропустил ?
function Check(string data, bytes32 hash, bytes32 r, bytes32 s, uint8 v) public returns (bool) {
var calculatedHash = keccak256(this, data);
// do we need this ?
assert(hash == calculatedHash);
// should not this one be sufficient ?
assert(msg.sender == ecrecover(calculatedHash, v, r, s));
}
Если вам нужно доказать, что данные, которые вы пытаетесь проверить, соответствуют заявленным, вам нужно проверить, соответствуют ли они хэшу, который создает действительную подпись. В противном случае все, что вы проверяете, это то, что рассматриваемый ключ что-то подписал, но не то, что они подписали.
Часть, которую ваш пример мог бы опустить, - это передача хэша в функцию в качестве параметра. Вы могли бы просто снова вычислить хеш из данных, а затем проверить, что хеш был подписан с правильным ключом.
В некоторых рабочих процессах вы могли создать хэш ранее и сохранить его в качестве идентификатора для вашего контракта вместо данных. В этом случае вы можете пропустить передачу данных на этом этапе и просто работать с хешем.
Я считаю, что криптографическим свойством, которое эта функция пытается проверить, является целостность :
Шифрование с открытым ключом в оболочке (EPKE) — это метод применения криптографии с открытым ключом, обеспечивающий конфиденциальность электронного сообщения и защиту содержимого сообщения от изменения (целостность связи).
Глядя на функцию изолированно (без какого-либо контекста бизнес-процесса), трудно быть уверенным в том, чего эта функция проверки надеется достичь, как она вызывается и т. д., но я думаю, что это делается для того, чтобы злоумышленник не смог подорвать проверка, выдавая себя за другую учетную запись
ecrecover вернет открытый ключ в паре с закрытым ключом учетной записи, использованной для подписи этого сообщения — проблема с наивным вызовом этой функции является своего рода «атакой воспроизведения» .
Допустим, как злонамеренный субъект, что мне выгодно олицетворять открытый ключ P.
Допустим также, что есть протокол связи, в котором мы отправляем клиентам сообщение и просим их подписать его, чтобы подтвердить свою личность для их аутентификации.
Допустим также, что ваша система просто наивно взяла содержимое сообщения, возвращенного клиентом, и не проверила совпадение его хеша с исходным сообщением.
Как злоумышленник, я мог бы выдать себя за P, просмотрев в блокчейне сообщения, которые M вернул вам, и внедрив одно из них в свой ответ. Ecrecover вернет открытый ключ P, и функция проверки будет нарушена.
Бруно Гридер
Эдмунд Эдгар
Гарен Вартанян
eth_sign
хеширует сообщение перед подписанием.Эдмунд Эдгар