Учитывая, что у человека B есть только открытый ключ, файл, подпись и хэш, будет ли проверка подписи с использованием открытого ключа достаточной, чтобы доказать, что лицо A подписало фактический файл?
Человеку Б не нужен хэш. Если они получат его, они смогут использовать его для целей отладки или досрочного прекращения проверки, но им не следует доверять ему. Далее я игнорирую любой хеш, который мог получить человек Б.
Лицо Б должно хэшировать файл и проверить, верифицируются ли этот хеш, открытый ключ и подпись.Это должно доказать, что человек А подписал файл.
Хеширование является такой важной частью проверки подписи, что обычно утверждается так: Лицо Б должно проверить, проверяются ли файл, открытый ключ и подпись.
Исключением из абзаца выше является случай, когда поверх системы подписи уже можно подписать сообщение/файл любой длины с помощью хэша. $H_1$, добавлен еще один слой хеширования с помощью хэша $H_2$. В этом случае было бы сказано: человек Б должен хэшировать файл с $H_2$, и проверьте, есть ли этот хэш, открытый ключ и подпись, проверьте (неявно: с помощью хеш-функции $H_1$ применяется к результату $H_2$ в рамках проверки подписи). Такое составное хеширование иногда делается из соображений производительности, потому что $H_2$ по дизайну быстрее, чем $H_1$; или/и потому что $H_1$ выполняется устройством (например, смарт-картой) и $H_2$ выполняется другим (например, компьютером, использующим смарт-карту).
Какие хэши и алгоритмы подходят (подходят) для этого?
С теоретической точки зрения для подписи нужен хэш-алгоритм, устойчивый к коллизиям (подразумевающий устойчивость ко второму прообразу) и имеющий ширину, подходящую для рассматриваемой системы подписи.
Если эта ширина не превышает 512 бит, ША-512 соответственно усеченный будет делать. Для произвольного размера есть встряхнуть256. Для большей скорости есть Блейк2.
С практической точки зрения хэш обычно определяется системой подписи или ее параметрами, и эта спецификация часто встраивается в открытый ключ в сертификате открытого ключа.
Примером широко используемого алгоритма подписи и хэша является ЭЦДСА с кривой секп256р1 и хэш ША-256. Другой пример Эд25519, который указывает алгоритм, кривую и хеш (обратите внимание, что Ed25519ph похож на Ed25519, за исключением двойного хэширования в исключении выше).
¹ Нет ничего лучше абсолютного доказательства: возможно, открытый ключ принадлежит не человеку А; или у человека был украден закрытый ключ; или их компьютер находился под контролем злоумышленника, поэтому А хотел подписать что-то совсем другое; либо система подписи, либо хэш не работает...