Tag: 智能卡

使用不同SC系列探测智能卡:清除SC状态的命令

我希望从不同供应商,不同用途,不同APDU的一堆智能卡中读取一些基本信息。 例如:国家识别智能卡,EMV(支付),手机SIM,javacard等…… 我写了一个Java应用程序。 让我用SC系列ABCDE和相同名称调用5个子程序,每个子程序都有正确的APDU来读取一个特定SC系列的基本信息。 不幸的是,我发布例程的顺序会影响成功的结果。 示例:使用子程序ABCDE,我可以读取ABCD类型的SC,而不是E. 如果我将执行顺序更改为EABCD,我可以读取E但现在我的C类型的SC失败了。 我理解:一些SC丢弃外国APDU ……其他SC“挂起”。 是否有基本命令来清理智能卡(和读卡器)的状态? 那么子程序的执行顺序不会改变输出? 复位B复位C复位D复位等… 是ATR吗? 它对每种SC都是强制性的吗?

外部共享资源的Java并发模式(智能卡)

我有一个Web服务器服务,客户端请求智能卡计算并获得结果。 可用的智能卡号可以在服务器正常运行时间内减少或增加 ,例如,我可以从阅读器中物理添加或删除智能卡(或许多其他事件……例如exception等)。 智能卡计算可能需要一段时间,因此如果存在对Web服务器的并发请求,我必须优化这些作业以使用所有可用的智能卡。 我想过使用智能卡线程池。 至少在我看来,不寻常的是,池应该改变它的大小,而不是取决于客户端的请求,而只取决于智能卡的可用性。 我研究过很多例子: BlockingQueue :存储请求和停止线程等待某事做的好看。 FutureTask :我可以使用这个类来让客户端等待它的答案,但是哪种类型的执行者应该完成任务呢? ThreadPoolExecutor :似乎我需要什么,但有了这个我不能改变池大小,而且每个线程应该链接到一个智能卡插槽。 如果我可以更改池大小(在插入智能卡时添加线程并在删除智能卡时删除线程)以及我是否可以为每个线程分配特定智能卡,这可以是一种解决方案。 这是智能卡控制,每个智能卡有一个SmartcardWrapper,每个智能卡都有自己的插槽号。 public class SmartcardWrapper{ private int slot; public SmartcardWrapper(int slot) { this.slot=slot; } public byte[] compute(byte[] input) { byte[] out=new byte[]; SmartcardApi.computerInput(slot,input,out); //Native method return out; } } 我试图创建一个每个智能卡一个线程的线程池: private class SmartcardThread extends Thread{ protected SmartcardWrapper sw; public SmartcardThread(SmartcardWrapper sw){ this.sw=sw; […]

JDK 7u79中javax.smartcardio.Card.disconnect(boolean reset)的行为?

根据JRE 7u72的发行说明 : 更改javax.smartcardio.Card.disconnect(boolean reset)方法行为 在JDK 8u20和JDK 7u72版本之前,javax.smartcardio.Card.disconnect(boolean reset)方法对传递给它的’reset’布尔值具有反转逻辑。 如果错误传递给卡,则会在断开连接时重置该卡,反之亦然。 从JDK 7u72和JDK 8u20开始,已经实现了根据API文档的正确行为。 为了向依赖旧行为的用户提供向后兼容性,引入了新的系统属性。 以下命令行选项可用于强制执行旧的损坏行为: -Dsun.security.smartcardio.invertCardReset =真 默认情况下,此属性设置为7u72及更高版本的JDK 7更新版本。 默认情况下,JDK 7更新版本在此区域中不会发现任何行为更改。 此外,以下命令行选项可用于强制执行新的正确行为: -Dsun.security.smartcardio.invertCardReset = FALSE 这是8u20及更高版本JDK 8更新版本的默认设置。 在将来的Java版本中,将忽略/禁用该属性,并且默认的disconnect方法行为将由API指定。 当调用javax.smartcardio.Card.disconnect(true) ,即使我有JDK 7u79,卡也不会重置。 当我传递false或使用选项-Dsun.security.smartcardio.invertCardReset=true到VM时,一切正常。 怎么会这样? JDK 7u79附带了旧版本的JRE吗?

Java Web应用程序可以访问远程工作站上的智能卡读卡器吗?

我正在为一个现有的基于Java的Web应用程序开发一些新function。 Web应用程序本身托管在我们的一个内部服务器上,可以通过浏览器访问我们工厂的多个计算机终端。 该应用程序用于在我们的生产过程的各个阶段进行质量检查。 目前,用户需要通过从下拉列表中选择用户名并在进行每次质量检查之前输入密码来手动登录。 为了加快这个过程,我被要求实施智能卡读取登录。 我已经使用javax.smartcardio编写了一个实用程序类,我可以访问插入笔记本电脑的USB读卡器终端,从卡中读取ATR并在我在本地运行应用程序时使用信息登录到应用程序tomcat7服务器。 所以,在我的本地机器上,一切都很棒。 不幸的是,一旦我将应用程序部署到我们的Web服务器,我就再也无法检测到读卡器终端,因为我相信Java Web应用程序实际上正在寻找部署到它的机器上的读取器。 有什么方法可以让我的java代码通过与浏览器的交互访问插入远程工作站的读卡器? Web应用程序是用GWT编写的,我使用RPC调用来访问后端服务器端代码。 任何帮助是极大的赞赏。 读卡器代码非常简单,所以如果有帮助我会发布它: import java.util.List; import javax.smartcardio.Card; import javax.smartcardio.CardTerminal; import javax.smartcardio.TerminalFactory; public class SwipeCardUtil { private static org.apache.log4j.Logger LOGGER = org.apache.log4j.Logger.getLogger(“hwslqc”); /** * @return ATR */ public static String readCardATR() { String ATR = “”; try { // Show the list of available terminals TerminalFactory […]

Java Signature.verify导致SignatureException:签名编码错误由IOException引起:序列标记错误

首先,这不是一个重复的问题,因为大多数人在从缺少“— BEGIN RSA CERTIFICATE —”行的证书创建公钥时报告此exception。 我要做的事情的要点是1.使用SHA1withRSA算法在JCOP智能卡上签名50Byte消息(RSA密钥为1024位)。 2.将签名从智能卡导出到服务器。 3.validation服务器上的签名。 智能卡上的代码片段用于创建签名。 关键点是我在Java Card中使用算法Signature.ALG_RSA_SHA_PKCS1来创建签名。 private void setcustccid(APDU apdu) { byte[] buffer = apdu.getBuffer(); if (buffer[ISO7816.OFFSET_LC] != (byte)24) { ISOException.throwIt(ISO7816.SW_WRONG_LENGTH); } else { short bytesLeft = (short) (buffer[ISO7816.OFFSET_LC] & 0x00FF); short readCount = apdu.setIncomingAndReceive(); if (readCount < bytesLeft) { ISOException.throwIt(ISO7816.SW_BYTES_REMAINING_00); } try { Signature signature = Signature.getInstance(Signature.ALG_RSA_SHA_PKCS1, false); signature.init(privKey, […]

javax.smartcardio:如何向Desfire卡发送本机命令?

我正在创建一个通过PC / SC非接触式读卡器和javax.smartcardio API与Mifare DESFire卡通信的Java应用程序。 我设法定期发送ISO 7816 APDU(CLA,INS,P1-P2,Lc,Command数据,Le)。 我在Ridrix的博客上看到 ,DESFire卡(至少我使用的EV1版本)支持APDU和Native命令 ,其中大多数命令只有1个字节长。 例如,“ 获取版本 ”命令: Command: 60 Response: af 04 01 01 00 02 18 05 我使用SpringCard的PC / SC Diag程序( 可在此处 )测试了该命令,我得到了正确的响应。 但我无法使用javax.smartcardio发送此命令:此API似乎是为真正的 APDU创建的,因此不允许1字节长的命令。 这是我做的: public static void main(String[] args){ TerminalFactory factory = TerminalFactory.getDefault(); CardTerminals terminalList = factory.terminals(); try { CardTerminal ct = terminalList.list().get(0); ct.waitForCardPresent(0); Card […]

线程“main”中的exceptionjava.lang.UnsatisfiedLinkError“

当我运行智能卡读取程序时会出现此exception。 我的设备没有连接。 请帮帮我。

javax.smartcardio – javadocs

我正在研究javax.smartcardio类。 我正在使用eclipse 3.6而且我有JDK 6 SE。 我可以使用语句import javax.smartcardio。*或其任何单独的类,只要我更改首选项以警告或忽略禁止的引用。 我没有在Java SE 6的标准文档中看到任何提及javax.smartcardio的内容,也没有在eclipse中弹出javadoc帮助。 我在这里找到了文档。 有没有办法将Eclipse链接到smartcardio的javadocs?

使用READ BINARY读取超过256个字节

我正在尝试使用javax.smartcardio读取智能卡( 德语Gesundheitskarte ) 在EF“PD”的定义中,其长度被指定为850字节。 内容应该是这里指定的经过压缩的ISO5589-15编码的XML字符串 作为我发送的CommandAPDU 00 B0 00 00 00 得到前256个字节。 发送后 00 B0 00 FF 00 我得到接下来的256个字节。 但我怎么得到其余的? 我怎么知道二进制数据何时结束? 德国规范第1部分 | 德国规范第2部分