Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何访问Omnikey 3121智能卡读卡器_Java_Smartcard_Javacard_Smartcard Reader_Omnikey - Fatal编程技术网

Java 如何访问Omnikey 3121智能卡读卡器

Java 如何访问Omnikey 3121智能卡读卡器,java,smartcard,javacard,smartcard-reader,omnikey,Java,Smartcard,Javacard,Smartcard Reader,Omnikey,我想用Java通过万能读卡器访问智能卡。我找到了一些解决方案,比如smartcardio,但效果还不够。基本上我和reader连接,但当我不需要它时,它使用APDU。我有一个想法,通过USB向我的阅读器打开stream,然后通过stream向设备发送二进制命令,然后以同样的方式得到答案,但从技术上讲,我如何用Java编写它呢 我还发现了像usb4java这样的库,但对此也有不好的看法。也许有人有过使用这个设备的经验,可以给我一些提示吗 在互联网上,关于智能卡编程的教程并不多。我还尝试使用pyAp

我想用Java通过万能读卡器访问智能卡。我找到了一些解决方案,比如smartcardio,但效果还不够。基本上我和reader连接,但当我不需要它时,它使用APDU。我有一个想法,通过USB向我的阅读器打开stream,然后通过stream向设备发送二进制命令,然后以同样的方式得到答案,但从技术上讲,我如何用Java编写它呢

我还发现了像usb4java这样的库,但对此也有不好的看法。也许有人有过使用这个设备的经验,可以给我一些提示吗


在互联网上,关于智能卡编程的教程并不多。我还尝试使用pyApduTool或HID Omnikey Sync API V2.0,但这仅用于测试。我必须写一些简单的请求才能从信用卡中获取信息。

基本上有两种解决问题的方法:

  • 不要使用java.smartcardio使用的PC/SC接口,而是使用读卡器制造商提供的本机专有库,例如使用包装器(基于JNI,但有更好/更高级别的替代方案)

  • 继续使用APDU,但使用CLA字节设置为
    FF
    hex,打开与读卡器的连接
    FF
    是保留的,但它通常是为这种读卡器访问而保留的,例如,访问读卡器制造商支持的没有ISO/IEC 7816-4层的存储卡

  • 其中两个(仅用于完整性):许多读卡器是使用USB到串行接口芯片创建的,这意味着您可以直接连接到(虚拟)串行接口;不用说,如果这个接口存在的话,您必须知道自己发送和编程的命令是什么(Omnikey3121相对较新,所以我会感到惊讶)

  • 这两个选项都依赖于读卡器的特定功能,因此您必须找到信息,以便读卡器了解可能的情况。据我所知,没有办法要求提供什么功能。对于这种功能,不要对标准化抱有太高的期望


    您是否查看了读卡器的特定文档?

    我不完全理解您的问题“在我不需要时使用APDU”。通过APDU与卡进行通信,这是迄今为止最简单的方法。为了简单起见,您必须与读者交流的更奇特的任务通常也映射到APDU。首先看一看它的答案。这个问题有很多,但不在其中的是你想做的。@MaartenBodewes你的意思是什么?@guidot我必须发送这张卡的特定请求,所以我想打开流,然后发送二进制请求。但是谢谢你的链接。谢谢,我会试试的。我还有一件事我不明白。我找到了获取响应的解决方案(基本上就是从卡中获取“hello”,因为我知道每个卡的命令都是相同的),在使用命令之前的第一步是“selectapplet”。我不知道我的卡有什么帮助,所以我试着通过“PyApduTool”知道,在连接之后,我切换到“Applet”选项卡。刷新后获得信息“列表小程序失败。错误:GP init update失败。recv:6D 00”。也许你知道那意味着什么?(我知道什么是6D 00代码,我的卡肯定是用Java编程的)6D00是未知指令。您需要在卡管理器中执行这些操作,您可以通过帮助进行选择。它要么是VISA one(最初被VISA/Mastercard称为OpenPlatform as is),要么是GP one,用于更新的卡。但是,对于INIT UPDATE/EXT AUTH,您需要知道安全域的密钥。这些通常不适用于发行的卡。例如,POS终端知道银行应用程序的帮助,不需要列出它们。不幸的是,我通过使用usb4java库获得了“无法打开USB设备:此平台上不支持或未实现的操作”。是的,太新了,不记得其中有一个FTDI芯片。可能是单芯片解决方案,集成它已经太贵了。无论如何。。我最终使用APDU协议发送请求。我得到响应,但数据返回为ISO 7816。我试图解析字符串的响应,但有些数据被解析为无法识别的字符。。作为�. 您能推荐一种在Java中解码apdu响应的好方法吗?