В настоящее время я работаю над проектом, который соответствует почти тем же требованиям, которые вы указали в своем вопросе.
Мы используем USB-устройство для генерации подписей. Устройство от компании IronKey , оно чрезвычайно безопасно и соответствует многим стандартам безопасности. Устройство имеет аппаратно сгенерированную пару ключей, которую можно использовать для подписи и проверки.
Когда пользователь отправляет данные с помощью нашего приложения, мы инкапсулируем данные в документ xml, затем мы генерируем хеш с помощью sha256, и, наконец, мы используем устройство через pkcs11 для подписи хеша. Затем подпись и данные хранятся в клиентской базе данных, а затем отправляются на наш сервер, где мы можем выполнить проверку с использованием открытого ключа от токена пользователя (хранится в нашей базе данных сервера на момент выдачи токена).
Это не выполняется с помощью веб-приложения из-за того, что необходимо выполнить доступ токена на стороне клиента.
Надеюсь, это поможет, я пропустил много деталей, если у вас есть другие вопросы, дайте мне знать!