Android NFC从ePassport读取数据

问题描述 投票:6回答:3

我正在开发电子护照阅读器应用程序,我已经关注了一些较旧的问题,并且我已使用以下代码成功连接到护照。我的问题是我无法理解如何读取存储在护照中的所有数据(姓名,照片......)。这是我使用过的代码,应用程序运行良好(靠近NFC标签时提示)。

    @Override
    protected String doInBackground(Tag... params) {

        //Tag tag = params[0];

        Intent intent = getIntent();

        //Log.d(TAG,"params " + intent.getParcelableExtra(NfcAdapter.EXTRA_TAG));

        Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

        IsoDep dep = IsoDep.get(tag);

        if (dep == null) {
            // IsoDep is not supported by this Tag. 
            return null;
        }

        byte[] CMD = {
                    (byte)0x00, /* CLA = 00 (first interindustry command set) */
                    (byte)0xA4, /* INS = A4 (SELECT) */
                    (byte)0x04, /* P1  = 04 (select file by DF name) */
                    (byte)0x0C, /* P2  = 0C (first or only file; no FCI) */
                    (byte)0x07, /* Lc  = 7  (data/AID has 7 bytes) */
                    /* AID = A0000002471001: */
                    (byte)0xA0, (byte)0x00, (byte)0x00, (byte)0x02,
                    (byte)0x47, (byte)0x10, (byte)0x01
            };

        byte[] GET_RANDOM = { 
                (byte) 0x00, // CLA Class        
                (byte) 0x84, // INS Instruction
                (byte) 0x00, // P1  Parameter 1
                (byte) 0x00, // P2  Parameter 2
                (byte) 0x0E  // LE  maximal number of bytes expected in result
            };

            try {
                dep.connect();

                byte[] result = dep.transceive(CMD);// CONNECT

                Log.d(TAG, "result " + result[0] + " " + (byte)0x90);

                if (!(result[0] == (byte) 0x90 && result[1] == (byte) 0x00))
                        throw new IOException("could not select applet");

                if(dep.isConnected()==true)
                    Log.d(TAG,"IS CONNECTED!");
                else
                    Log.d(TAG,"ISN'T CONNECTED!");

                    result = dep.transceive(GET_RANDOM); // EXEC A CMD
                    int len = result.length;
                    if (!(result[len-2]==(byte)0x90 && result[len-1]==(byte) 0x00))
                       throw new RuntimeException("could not retrieve msisdn");

                    byte[] data = new byte[len-2];
                    System.arraycopy(result, 0, data, 0, len-2);
                    String str = new String(data);

                    Log.d(TAG, str);

                    dep.close();

            } catch (IOException e1) {
                e1.printStackTrace();
            }



        return null;
    }
android nfc
3个回答
12
投票

您需要针对您的epassport制作一个BAC(基本访问控制),以便能够阅读护照上印刷的基本信息(国家,姓名,姓氏,国籍,出生日期,性别......)和MRZ(机读)区域,也就是护照底部的两条大线)。所有这些信息都位于DG(数据组)1中,照片位于DG2中。您可以在其他DG中找到其他信息,例如DG3需要读取EAC(扩展访问控制),因为它包含敏感数据(指纹)。

您可以使用JMRTD库从Android手机中读取它。市场上有一个“演示”Android应用程序here。否则,您可以开始阅读位于here的ICAO(国际民用航空组织)的官方文件。在本文档的最后,您可以找到一些示例,以便您可以自己实现BAC。

您还可以查看the JMRTD source code来帮助您编写代码。 IMO编码非常复杂,但学习起来非常有趣。你写的代码是一个好的开始!


2
投票

这不是一个答案,而是路易斯上面提供的信息的补充。


以下是各种数据组参考编号的列表:


以下是EAC描述的摘录:


-2
投票

通常,电子护照可以防止正常访问。因此,在阅读ePass之前,必须对数据页进行光学扫描,将其发送到安全服务器(边界控制等)。他们将检查它,进行光学数据识别()并提供对集成RFID芯片的安全访问。因此,无法创建阅读官方护照的应用程序。您可能只是阅读某些护照中的UID或只是检测到有“某事”。

© www.soinside.com 2019 - 2024. All rights reserved.