当前位置: 首页 > 知识库问答 >
问题:

如何读取智能卡上的用户数据?

池麒
2023-03-14

首先,我对智能卡还比较陌生,我不知道数据是如何存储的,哪些数据在智能卡上受到保护。

我正在读我的学生身份智能卡,它有PIN码保护。我一直在用默认的windows智能卡库(winscard.lib)用C编程。

我已经成功地阅读了ATR标题,但据我所知,ATR标题包含如何与读者沟通的信息,而不是用户信息。

我试过从卡中读取二进制文件,但APDU总是返回6E 00,表示“不支持类”或“错误指令”。以下是代码:

switch(dwProtocol)
    {
        case SCARD_PROTOCOL_T0:
        {   
            pioSendPci = *SCARD_PCI_T0;
            break;
        }
        case SCARD_PROTOCOL_T1:
        {
            pioSendPci = *SCARD_PCI_T1;
            break;
        }
        default:
        {
            printf("Detecting protocol failed!");
            printf("Press <ENTER> key to terminate!\n");
            nResponse = getchar();
            lRet = SCardReleaseContext(hContext);
            return -1;
        }
    }

    lRet = SCardTransmit(hCard,
                        &pioSendPci,
                        (LPCBYTE)&cmdRead,
                        sizeof(cmdRead),
                        NULL,
                        (LPBYTE)&recvbuffer,
                        &atrLen);

    printf("APDU return code:\n");
    printf("=================\n");
    for(i=0; i<2; i++)
    {
        printf("%02X ", recvbuffer[i]);
    }
    printf("\n");

    if(lRet!=SCARD_S_SUCCESS)
    {
        printf("Transmission failed! ErrorCode = 0x%08X\n",lRet);
        printf("Press <ENTER> key to terminate!\n");
        nResponse = getchar();
        lRet = SCardReleaseContext(hContext);
        return -1;
    }

其中cmdRead如下所示:

BYTE cmdRead[] = { 0x00, 0xB0, 0x00, 0x00, 0x00, 0x00, 0xFF };

怎么了?我需要先验证卡才能读取二进制文件吗?read binary是读取学生id等基本数据的正确函数吗?

共有3个答案

潘嘉佑
2023-03-14

首先,@guidot提到这是一个无聊的过程。你不仅有关于JavaCard的完整信息,还应该知道如何破解智能卡之类的东西,因为你没有任何卡供应商规范,他们可能会在他们的卡上使用安全性,你应该知道密钥。

但请参考,根据ISO 7816-40x6E00的规定,表示“不支持类”。您可以在这里查看完整的APDU响应列表。

类(CLA)字节通常是0x000xA00xC00xF0,有时被0x0C屏蔽,表示某些卡上的安全消息传递。

要访问小程序防火墙内的数据,应选择该小程序,当JCRE(Java卡运行时环境)接收到数据与小程序的帮助匹配的select APDU时,会发生小程序选择。如果安装了安全域,那么您应该拥有这些安全密钥,以便成功选择小程序。

要获得与读卡器通信的APDU命令列表,请选中此链接。

这里有很多关于用C编写智能卡库的信息,它使用WinSCard。dll与读取器进行通信。

此外,这个链接是关于java卡中的文件系统结构,如果小程序将其数据存储在文件中,这将是有用的。

这个链接是在javacard中选择文件的一个例子。

如果您想进一步了解java卡小程序的实现,这里有一个关于如何实现java卡小程序的指南。请注意,不要忘记阅读最重要的现有文档,如全球平台和ISO 7816。

刘丰羽
2023-03-14

我能想到两个原因,为什么卡返回6E00。

>

  • 当前选择的应用程序是卡管理器或除您要使用的应用程序之外的任何其他小程序。在发送READ命令之前,可以尝试执行SELECT AID命令。但是,您应该知道要选择的小程序的实例帮助。

    您试图读取的文件受安全消息保护,您的APDU命令应该加密/MACE,例如将CLA字节更改为“0C”。但是,您需要先建立一个安全通道,然后才能执行此操作。

    正如@guidot所说,如果没有规范,这将非常困难。

  • 南门烈
    2023-03-14

    如果卡片上没有学生申请的说明,这是一个漫长而无聊的过程。假设你在卡上有一个文件系统(与java卡相反),你需要知道用户数据存储在哪个文件中,这样你就可以在发布READ BINary pr READ RECORD之前选择合适的文件,如果它是一个记录-定向文件。您可以尝试通过反复试验找到正确的文件ID,但是...请注意,在智能卡上,访问条件是以非常细的粒度定义的,所以可能有文件,可以在没有任何认证的情况下读取,而在另一个极端,可能有文件只有在建立了安全通道后才能通过安全通道使用消息传递(加密和MAC保护的命令和或响应)。

     类似资料:
    • 我使用ACR122U-A9读取智能卡,通过以下APDU,我可以获取UID和ATS: 使用NXP TagInfo应用程序(android),我可以看到一个包含我所需数据的十六进制表。使用什么APDU命令可以检索这些数据? 六边形表如下所示: [0000]中是我想要检索的数据。

    • 问题内容: 因此,最近我一直在使用具有一些信息的智能卡,而我想要在此处实现的目标是使用智能卡读取器通过任何Android智能手机从这些智能卡中获取此数据。我一直在使用HID OMNIKEY 3021 USB 智能卡读取器来读取这些卡(而且我知道此读取器可通过Windows应用程序与这些卡配合使用,因为我已经对此进行了亲自测试) 现在,Android提供了USB主机,只要Android智能手机支持它

    • 我正试图从智能卡读取证书, 这是我从http://www.developer.com/java/other/article.php/3587361/Java-Applet-for-Signing-with-a-Smart-Card.htm我将在applet中执行这段代码,问题是每个用户都必须向我指出他们的本地pkcs11。。。dll,使用java samrtcard api是否可以避免加载此dll

    • 我已经实现了一个Andoid应用程序-服务器端应用程序。服务器与智能卡读卡器通信。当用户在Android应用程序中触摸按钮时,将构建一个连接到服务器以验证用户。应用和服务器之间交换的消息具有以下格式: 如果消息的类型值,则表明智能卡读卡器中存在错误 如果消息的类型值,则表明智能卡中存在错误 我使用如下代码与智能卡读卡器进行通信: 智能卡IO API具有异常的类。我的问题是,我不知道何时发送类型为或

    • 问题内容: 我已经编写了一个applet,并将其安装在智能卡中。但是我不知道如何在智能卡上读写数据? 从智能卡读取数据是否正确? 请告诉我如何使用javacard将数据写入智能卡。 问题答案: 我找到了解决方案。实际上我正在使用eclipse,因为其中安装了编辑器java卡插件。当我在智能卡上运行程序时,每次都会在以前的applet上安装最新的applet。要查看结果,我们可以使用pyapdu工具

    • 我有一个Java应用程序,可以从智能卡读取证书,并使用它们登录用户。该应用还可以使用其他登录方法(用户名和密码)跟踪失败的登录尝试。 我想知道是否有可能在没有引脚的情况下从智能卡中读取用户信息?我想将失败的pin条目标记为失败的登录尝试,但是因为我需要pin从证书中读取别名,所以我无法知道哪个用户正在尝试登录。有没有读取这些信息没有引脚在Java? 我根据这个线程的建议尝试加载KeyStore对象