Использование смарт-карты для ввода идентификатора пользователя в форме Java
Я очень новичок в программировании на Java и Smartcard. У меня есть это требование, которое выглядит просто, но я не могу найти точный ресурс до сих пор.
У меня есть форма JPanel, которая запрашивает идентификатор пользователя. После ввода идентификатора пользователя выполняется целый ряд программ, которые прекрасно работают.
Мое требование: я хочу, чтобы идентификатор пользователя вводился с использованием Javacard. Таким образом, Java-карта должна содержать идентификатор пользователя, который заполняет текстовое поле User ID моего JPanel, когда оно вставляется в кард-ридер.
Любая помощь в этом отношении высоко ценится.
Спасибо
2 ответа
Зависит от того, какой протокол использует смарт-карта. Смарт-карта может отвечать на произвольные запросы (известные как APDU) произвольными ответами. Как правило, ваш разговор со смарт-картой выглядит так:
- Приложение: "Перечислите сертификаты X.509 (имена пользователей и открытые ключи), для которых вы знаете закрытые ключи".
- Карта: "Сертификат X.509 для CN=Bob, подписанный Active Directory компании с CN=..."
- Приложение: "Аутентифицировать пользователя с помощью этого PIN-кода: 1234"
- Карта: "PIN-код действителен". Карта готова к использованию своего закрытого ключа.
- Приложение: "Скажите мне подпись RSA (PKCS#1), используя ваш закрытый ключ этого 32-байтового случайного числа...32 байта..."
- Карточка: "...128-байтовая подпись..."
- Приложение проверяет действительность подписи, используя открытый ключ, подтверждая, что на карте действительно хранится закрытый ключ. Обратите внимание, что приложению никогда не разрешается читать закрытый ключ; он никогда не переносится с карты.
Это базовая информация, которую вы хотите использовать со смарт-картой. Какой конкретный API вам нужно использовать, зависит от того, какой протокол / библиотеки предоставляет вам производитель карт. Похоже, вы на самом деле не заботитесь об аутентификации карты; Вы просто хотите прочитать имя пользователя. Тогда вы можете просто остановиться после первого шага. Но вы должны пройти все этапы, если хотите убедиться, что карта подлинная, а не дубликат.
Обычно компания, которая программировала смарт-карту для PKI, также предоставляет собственную библиотеку, которая реализует интерфейс PKCS#11 C. В этом случае вы можете настроить JCE-провайдер SunPKCS11 на использование правильных файлов pkcs11 .dll или.dylib. Затем вы можете получить доступ к KeyStore и PrivateKey на карте.
Если карта соответствует стандартному протоколу, такому как PKCS#15, вы можете использовать динамическую библиотеку OpenSC pkcs11 вместо этого вместе с поставщиком JCE SunPKCS11. Вы также можете использовать утилиты командной строки OpenSC для проверки карты.
Альтернативой является непосредственное обращение к смарт-карте с использованием APDU. Вы делаете это с помощью API javax.smartcardio (хотя я должен предупредить вас, что реализация Sun содержит ошибки в OS X; используйте вместо этого jnasmartcardio). Для этого вам нужно знать конкретный протокол, который карта должна реализовывать. Обычно это PKCS # 15; см. APDU MyEID для сокращенного списка основных APDU.
Вы смотрели на это? Не проверено лично, но это может быть отправной точкой. http://docs.oracle.com/javase/7/docs/jre/api/security/smartcardio/spec/