Задумался вот. Допустим, пишем мы вебсайт, к которому есть такое интересное требование -
non-repudiation. То есть если юзер выполняет на нём некое действие - он не должен иметь возможности отрицать, что он его совершил, даже если сайт вместе со своей датабазою взломан вдребезги и пополам.
На первый взгляд, всё довольно тривиально - даём юзеру смарт-карту с секретным ключом, им подписывается тело любого POST- или PUT-запроса на сайт. Запросы сохраняются в лог и хранятся там, пока релевантность не отпадёт.
На второй - немного сложнее. Насколько я понимаю, не существует никакой возможности обращаться к ключам на смарткартах, TPM, Windows store и т.д. из бегущего в браузере JavaScript-а. И по хорошей причине - такая возможность дала бы недобросовестным сайтам выполнять операции с юзерскими ключами (подписывать или расшифровывать что-то) без ведома юзера. Даже если юзер должен разрешить доступ к ключу введением кода - ему неоткуда знать, как именно ключ используется, приходится полагаться на приложение.
Существует "
Web Cryptography API", но он, насколько я понимаю, не позволяет обращаться к смарткартам и прочим устройствам PKCS#11 - он позволяет генерить ключи прямо в браузере и хранить их в local storage и т.д. Защитой, необходимой для non-repudiation, такие ключи не обладают.
Существует также проект "
Web eID", который позволяет это ограничение обойти за счёт установки расширений к браузеру - но он предполагает, насколько опять же понимаю, доверие к сгруженному с сервера Джаваскрипту, а нам именно это Заратустра и не позволяет.
Таким образом выходит, что клиентская часть должна быть обычным десктопным приложением и её логика не должна задаваться на серверной стороне. Так ведь?
Ну а для контента, выдаваемого сервером, организовать non-repudiation не в пример легче, и не дорого - генерим неизвлекаемый ключ в каком-нибудь online HSM, скажем, в том же Azure Key Vault, и подписываем отсылаемые файлы.
То, что смарт-карта не должна позволять экспорт ключей, тривиально - а вот есть ли смарт-карты, не разрешающие также и импорт? Чтобы ключ можно было бы сгенерировать лишь в ней, и быть уверенным, что он существует лишь в единственном эксземпляре?
Это свойство и для аутентификации полезно, но для non-repudiation - особенно.
Даже и в этом случае хитрый юзер мог бы отпираться "я не я и корова не моя" - мало ли что в сертификате написано, может, админ CA сам его себе на моё имя выписал. А смарткарту и потерять можно. Способ это побороть - заставить расписаться (ручкой по бумажке) при получении смарткарты, с указанием thumbprint сертификата - для каждого ключа уникального. Ну или использовать такие карты, от которых особо не пооткрещиваешься, типа нового израильского "биометрического" удостоверения личности - хоть там
косяков и полно.