【问题标题】:Java - how to detect smartcard hotplugJava - 如何检测智能卡热插拔
【发布时间】:2011-03-24 17:07:52
【问题描述】:

我在 java 中动态加载 pkcs11 安全提供程序,只要在运行应用程序之前插入智能卡读卡器,它就可以工作。谁能告诉我在应用程序运行时如何检测智能卡热插拔?实际上我在java中需要类似pcsc_scan的东西。环境是带有 java 1.6.0_20 的 Ubuntu 9.10。 提前致谢

【问题讨论】:

    标签: java security


    【解决方案1】:

    PKCS#11 没有定义主动通知应用程序有关设备插入/移除的标准方式。您可以做的最好的事情是运行一个线程,该线程将每秒左右检查一次插槽的数量及其状态。

    【讨论】:

    • 是的,我这样做了...我看起来像 p11 = PKCS11.getInstance("/usr/local/lib/libsiecap11.so", "C_GetFunctionList", null, false);长 [] 插槽 = p11.C_GetSlotList(true);我遇到了同样的问题。好消息是,每当移除卡时我都可以看到,但在应用程序运行时插槽数量仍然没有改变。例如 - 如果我将智能卡读卡器放入 USB 插槽并运行我的应用程序,插槽数将为 1。尽管我放置了另一个智能卡读卡器(应用程序仍在运行时),但插槽数仍为 1。
    • 插槽的数量通常是一样的,但是它们的状态会改变。放置两个读卡器(它们是否属于同一供应商?)不会改变插槽数量的事实可能是 PKCS#11 驱动程序的缺陷。在这种情况下,您需要与驱动程序供应商联系。
    • 是的,这两张卡来自同一个供应商(制造商 ID:Siemens AG (C)... 型号:CardOS V4.3B (C))...所以如果我在没有智能卡的情况下启动应用程序提前插入 - 方法 C_GetSlotList() 将始终返回 0。例如,PC/SC 设备扫描仪 (pcsc_scan) 工作正常,并且每当我在计算机中插入或拔出智能卡时都会检测到。
    • 那就是PKCS#11驱动本身的问题。我们以前在某些硬件上看到过这样的问题。 PKCS#11 驱动程序远非理想(部分原因是标准不明确,部分原因是编程错误)。
    【解决方案2】:

    您能否将javax.smartcardio.* API 与 PKCS #11 结合使用?

    CardTerminal 类具有 isCardPresent()waitForCardPresent(timeout)waitForCardAbsent(timeout) 方法,可用于在单独的线程中轮询卡片插入事件。

    【讨论】:

      猜你喜欢
      • 2016-01-22
      • 2017-05-25
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多