【问题标题】:Send APDU commands to USIM/SIM card in android在android中向USIM/SIM卡发送APDU命令
【发布时间】:2020-02-10 14:32:01
【问题描述】:

我已经使用过智能卡,并且熟悉 APDU 命令(在 ISO/IEC 7816全球平台 规范中定义)。

现在我想知道是否有任何方法可以向插入手机的 USIM/SIM 卡发送 APDU 命令? (安装了 Android v4.4.4 kitkat 的三星 A3。)

我已经在 Google 中搜索了一些相关的主题和工具,名为 SIM Toolkit ApplicationSeek for Android。但我真的不明白这些是什么?这些项目是我必须在手机上安装的两个应用程序吗?还是USIM/SIM卡上已经安装了这两个工具,并接收手机指令?

主动命令APDU命令AT命令有什么区别?

我应该学习android来开发SIM卡应用还是只需要Java Card规范和ETSI标准?

提前致谢。

【问题讨论】:

    标签: java android smartcard javacard sim-card


    【解决方案1】:

    您的 SIM 卡上可能有两种不同类型的小程序。

    常用小程序

    用普通 JavaCard 编写的普通小程序。这是您在普通智能卡世界中习惯使用的小程序类型。它具有process 方法,智能卡是通信中的被动主体:您的应用发送 APDU 命令和卡响应。

    您可以使用一组名为 SEEK for Android 的特殊 Android 库与这些小程序进行通信。看看这个tutorial,了解如何创建这样的电话应用程序。

    从 API 级别 21 开始,还有一种使用 Telephony Manager 与 SIM 通信的方法。但是,有一个巨大的障碍:您的应用程序需要MODIFY_PHONE_STATE 权限,该权限只能授予系统应用程序。不允许使用常规的非系统应用程序。

    SIM 工具包小程序

    SIM 卡不仅仅是一张普通的智能卡,如果您想使用 SIM 卡提供的所有可能性,为 SIM 卡编写小程序可能比普通智能卡复杂得多。我建议您阅读this paper - 这是某人的学士论文,但对于我在互联网上找到的初学者来说,这是最好的概述。我也推荐this video from the DefConn conference

    加载在 SIM 卡上的小程序的作用不同:小程序不再是被动实体。电话会定期询问您的小程序:“有什么我可以为您做的新事情吗?”并且您的小程序可以回复:“是的,请发送此短信”或“告诉我现在几点”等。此外,您的小程序可以成为某些事件的监听器:来电、收到短信、经过的时间间隔等。是的,SIM卡从技术上看似乎是被动的,但它的作用其实是主动的:向手机发送指令的是SIM卡。

    这些命令称为“主动命令”或 SIM 应用程序工具包命令。结构相同——CLA INS P1 P2 LC数据LE;意思不一样。

    您可以使用名为 sim.toolkit 的特殊 JavaCard 包中的类从您的小程序发送它们。

    (SIM Application Toolkit 是一种标准,它指定主动命令的方式与 Global Platform 指定小程序生命周期的方式相同。)

    SIM Toolkit 小程序示例:

    import sim.toolkit.ToolkitInterface;
    import sim.toolkit.ToolkitRegistry;
    ...
    import javacard.framework.ISOException;
    
    public class STKTest extends Applet implements ToolkitInterface {
    
    public static void install(byte[] bArray, short bOffset, byte bLength) {
        // GP-compliant JavaCard applet registration
        new STKTest().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
    }
    //this method handles standard APDU commands
    public void process(APDU apdu) {
        // Good practice: Return 9000 on SELECT
        if (selectingApplet()) {
            return;
        }
    
        apdu.setIncomingAndReceive();
        final byte[] buf = apdu.getBuffer();
        switch (buf[ISO7816.OFFSET_INS]) {
        case (byte) 0x00:
            //do something
            break;
        }
    }
    //this method handles the SIM Toolkit commands
    public void processToolkit(byte event) throws ToolkitException {
        switch (event) {
    
        case ToolkitConstants.EVENT_TIMER_EXPIRATION:
            //do something
            break;
        }
    }
    
    }
    

    是的,您应该学习 Android - 您需要它才能使用 SEEK 库。您的问题非常广泛,如果需要,请向我询问任何详细信息。

    【讨论】:

    • 谢谢亲爱的vojta。 1- 所以,SEEK for Android 是一个库,我用它来为我的移动设备(而不是 SIM/USIM)编写小程序,以便与 USIM 上的小程序通信/SIM卡,对吧? 2-你知道什么是SIM Toolkit Appplicatin(又名STK)吗?
    • 主动命令是否与常规 APDU 命令相似?我的意思是他们是否有一个包含 CLA、INS、P1 和 P2 的 4 字节强制标头?还是完全不同?
    • 在第 1 节中您强调了普通智能卡在通信中是被动的。这是正确的。但这是否意味着 USIM/SIM 卡可以在与手机的通信中发挥积极作用,或者它们也总是等待命令而无法开始通信?您说手机会定期询问小程序“我可以为您做点什么吗?”(使用 SEEK for android 库编写的相同应用程序?)SIM 卡上的小程序会响应它.所以SIM卡是被动的。不是吗?
    • 我知道这些问题很多,但我有点困惑,我真的需要你的指导。感谢您的时间和考虑。 :) 还有一个问题,我稍后再问。再次提前感谢。
    • 亲爱的 vojta,我们可以在这里进行简短的交谈吗? chat.stackoverflow.com/rooms/78277/sim-applications-development
    【解决方案2】:

    从 API 级别 22 (Android 5.1) 开始,还有另一个选项称为“运营商特权”。它允许非系统应用使用 Android TelephonyManager 将 APDU 发送到 SIM 卡。看: https://developer.android.com/reference/android/telephony/TelephonyManager.html#hasCarrierPrivileges()

    例如,在 Google Play 上分发的移动网络运营商 (MNO) 应用程序可以使用此功能。 但同样,它并不对所有人开放。在这种情况下,您需要获得 SIM 的访问权限。 SIM 上的访问规则由发布它的 MNO 管理。也可以看看: http://source.android.com/devices/tech/config/uicc.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 2021-08-21
      • 2013-06-15
      相关资源
      最近更新 更多