Безопасность смарт-карт
1. Никак. Обращение к смарт-карте идет через API, который предоставляет драйвер. Если вредоносное ПО перехватило PIN, то оно с таким же успехом может производить операции со смарт-картой через API. Все можно реализовать в фоне.
2. Никак. Смарт-карта не знает, правильный документ или нет. Ей передают хеш документа, она шифрует его своим закрытым ключом и отдает результат обратно. Если передать хеш левого документа, то смарт-карта его без дополнительных вопросов зашифрует.
Вывод: плюс смарт-карты только в том, что из нее нельзя извлечь закрытый ключ (если все правильно настроено) и в том, что когда ее нет в ридере, то подписать ничего не возможно физически. А если рабочая среда скомпрометирована и у вредоносной программы есть PIN и доступ к API, то тут уж как говорится: «Против лома нет приема».
Все сказанное касается обычных смарт-карт, для Java карт можно добавить аплет с хитрой логикой, тогда просто API может быть недостаточно для подписания. Это вариант защиты, но требует дополнительных действий со стороны разработчиков и со стороны клиентского ПО.
А как же всякие удостоверяющие центры, трехузловые аутентификации (или как они там называются) и все такое?
Наверняка же должен быть способ.
Например, можно обязать смарт-карту подписывать только те документы, которые отправлены сервером. Для этого документ до подписывания смарт-картой должен быть подписан сервером (удостоверяющим центром)