Использование смарт-карты для ввода идентификатора пользователя в мою форму Java

Я новичок в программировании на Java и Smartcard. У меня есть это требование, которое выглядит простым, но я до сих пор не могу найти точный ресурс.

У меня есть форма JPanel, которая запрашивает идентификатор пользователя. После ввода идентификатора пользователя выполняется целая программа программирования, которая работает нормально.

Мое требование: я хочу, чтобы идентификатор пользователя вводился с помощью Javacard. Таким образом, Java-карта должна содержать идентификатор пользователя, который заполняет текстовое поле UserID моей JPanel, когда он вводится в устройство чтения карт.

Любая помощь в этом отношении высоко ценится.

Спасибо


person rahul kumar    schedule 01.01.2014    source источник


Ответы (2)


Зависит от того, какой протокол реализует смарт-карта. Смарт-карта может отвечать на произвольные запросы (известные как APDU) произвольными ответами. Обычно ваш разговор со смарт-картой выглядит так:

  • Приложение: «Перечислите сертификаты X.509 (имена пользователей и открытые ключи), закрытые ключи которых вам известны».
  • Карточка: «Сертификат X.509 для CN=Bob, подписанный Active Directory компании с CN=...»
  • Приложение: «Аутентифицируйте пользователя, используя этот PIN-код: 1234».
  • Карта: «ПИН-код действителен». Теперь карта готова использовать свой закрытый ключ.
  • Приложение: «Расскажите мне RSA (PKCS#1) подпись с использованием вашего закрытого ключа этого 32-байтового случайного числа... 32 байта...”
  • Карточка: «...128-байтная подпись...»
  • Приложение проверяет действительность подписи с помощью открытого ключа, доказывая, что на карте действительно хранится закрытый ключ. Обратите внимание, что приложению никогда не разрешается фактически читать закрытый ключ; он никогда не переводится с карты.

Это базовая обратная связь, которую вы хотите иметь со смарт-картой. Какой конкретный API вам нужно использовать, зависит от того, какой протокол/библиотеки предоставляет вам производитель карты. Похоже, вас не волнует аутентификация карты; вы просто хотите прочитать имя пользователя. Тогда вы можете просто остановиться после первого шага. Но вам придется пройти все этапы, если вы хотите убедиться, что карта подлинная, а не дубликат.

Как правило, компания, запрограммировавшая смарт-карту для PKI, также предоставляет собственную библиотеку, реализующую интерфейс PKCS#11 C. В этом случае вы можете настроить SunPKCS11 JCE Provider для использования правильной библиотеки pkcs11 .dll или .dylib. Затем вы можете получить доступ к KeyStore и PrivateKey на карте.

Если карта соответствует стандартному протоколу, такому как PKCS#15, вы можете вместо этого использовать динамическую библиотеку OpenSC pkcs11 вместе с поставщиком SunPKCS11 JCE. Вы также можете использовать утилиты командной строки OpenSC для тестирования карты.

Альтернативой является обращение напрямую к смарт-карте с помощью APDU. Вы делаете это, используя javax.smartcardio API (хотя я должен предупредить вас, что реализация Sun содержит ошибки в OS X; используйте jnasmartcardio вместо). Для этого нужно знать конкретный протокол, который карта должна реализовать. Обычно это ПККС#15; см. MyEID APDU для сокращенный список основных APDU.

person yonran    schedule 03.01.2014
comment
Большое спасибо. Это большое облегчение. Я вернусь, как только столкнусь с какой-либо проблемой. - person rahul kumar; 09.01.2014
comment
Еще раз спасибо, йонран. Я ознакомился с вашими предложениями и выбрал API javax.smartcardio в качестве предпочтительного решения. Но я застрял в точке, которую поднял как отдельный вопрос здесь. Не могли бы вы взглянуть на проблему и сообщить мне о возможной причине? Большое спасибо. - person rahul kumar; 03.02.2014

Вы смотрели на это? Лично не проверял, но может быть отправной точкой. http://docs.oracle.com/javase/7/docs/jre/api/security/smartcardio/spec/

person lviggiani    schedule 01.01.2014