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

Android上的Mifare Ultralight C身份验证

田成仁
2023-03-14

我有一些用于测试认证的Mifare Ultralight C标签。

我第一次使用应用程序NXP TagInfo阅读它时,我可以看到以下信息:

(...)
Page 04 - Page 27: FULL OF 0s **(empty tag)**
Page 28: 00 00 -- --
Page 29: 00 00 -- --
Page 2A: 30 -- -- --
Page 2B: 00 -- -- --
Page 2C: 42 52 45 41
PAGE 2D: 4B 4D 45 49
PAGE 2E: 46 59 4F 55
PAGE 2F: 43 41 4E 21

页面2C - 2F意味着它有默认的键“BREAKMEIFYOUCAN!”(< code > 425245414 b4d 454946594 f 5543414 e 21 )。

然后我运行我的Android应用程序,它基本上是这样做的:

>

  • 写入49454D4B41455242214E4143554F5946从第2C页到第2F页(用于身份验证)。

    在页面2A (42)写入0x04这意味着所有来自2A的网页都需要认证。

    在第2B页写0x00(43);这意味着读取和写入都需要身份验证。

    < b>

    //Start authenticating
    byte[] result1 = mifare.transceive(new byte[] {
                    (byte)0xA2,  /* CMD = WRITE */
                    (byte)0x2C,  /* PAGE = 44    */
                    (byte)0x49, (byte)0x45, (byte)0x4D, (byte)0x4B  /* 49 45 4D 4B */
            });
    
    byte[] result2 = mifare.transceive(new byte[] {
                    (byte)0xA2,  /* CMD = WRITE */
                    (byte)0x2D,  /* PAGE = 45    */
                    (byte)0x41, (byte)0x45, (byte)0x52, (byte)0x42  /* 41 45 52 42 */
            });
    
    byte[] result3 = mifare.transceive(new byte[] {
                    (byte)0xA2,  /* CMD = WRITE */
                    (byte)0x2E,  /* PAGE = 46    */
                    (byte)0x21, (byte)0x4E, (byte)0X41, (byte)0X43  /* 21 4E 41 43 */
            });
    
    byte[] result4 = mifare.transceive(new byte[] {
                    (byte)0xA2,  /* CMD = WRITE */
                    (byte)0x2F,  /* PAGE = 47    */
                    (byte)0X55, (byte)0X4F, (byte)0X59, (byte)0X46  /* 55 4F 59 46 */
            });
    //Finish authenticating
    
    //Say the pages the card needs authentication
    byte[] result5 = mifare.transceive(new byte[] {
                    (byte)0xA2,  /* CMD = WRITE */
                    (byte)0x2A,  /* PAGE = 42    */
                    (byte)0x04, (byte)0x00, (byte)0x00, (byte)0x00  /* Message = All pages after 04 needs authentication */
            });
    
    byte[] result6 = mifare.transceive(new byte[] {
                    (byte)0xA2,  /* CMD = WRITE */
                    (byte)0x2B,  /* PAGE = 43    */
                    (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00  /* Message = authentication is required both for reading and writing */
            });
    //Finish "card activition"
    

    完成此操作后,我使用恩智浦TagInfo应用程序再次读取标签,正如预期的那样,我再也看不到标签信息了。取而代之的是,它在所有字段(从 04 开始)上指示 .p XX XX XX XX,这表明它需要密码才能读取html" target="_blank">数据。

    在那之后(这是我看不到我的错误的地方)我尝试再次验证标签(通过写入第 2C - 2F 页),但我在身份验证部分开始时收到此错误:

    System.err: java.io.IOException: Transceive failed
    System.err:     at android.nfc.TransceiveResult.getResponseOrThrow(TransceiveResult.java:52)
            at android.nfc.tech.BasicTagTechnology.transceive(BasicTagTechnology.java:151)
            at android.nfc.tech.MifareUltralight.transceive(MifareUltralight.java:215)**
    

    我看不出我做错了什么。。。

  • 共有1个答案

    归翔
    2023-03-14

    你做错的是你没有真正实现MIFARE Ultralight C身份验证。在MIFARE Ultralight C标签上,写入页面0x2C.0x2F完全按照命令所说:它写入页面,但不执行任何身份验证。

    相反,MIFARE Ultralight C实现了三路相互质询-响应身份验证协议。该协议通过发送AUTHENT ICATE命令启动:

    byte[] result1 = mifare.transceive(new byte[] {
                (byte)0xA1,  /* CMD = AUTHENTICATE */
                (byte)0x00
    });
    

    为了响应该命令,您将获得一个质询,您需要使用身份验证密钥解密,操作,加密并发送回标签,以证明您确实拥有身份验证密钥。您可以在以下问答中找到一些实现MIFARE Ultralight C身份验证的代码:Android:使用NXP MiFare Ultralight C进行身份验证。

     类似资料:
    • 我已经正确地实现了Firebase电子邮件和Google登录,它在iOS和Android上都运行良好。然后我试着实现通过电话的身份验证,首先它在iPhone上不起作用,但后来我做了一些研究,似乎我必须上传一些APN,最后我正确地设置了它,现在它在iPhone上起作用了,但当我尝试向Android发送短信时,它没有接收到它,而是发送给我一条消息,表明代码是在iPhone上发送的,就像在iPhone上

    • 我有一个REST Jersey web服务。 php中基于令牌的身份验证 它在答复中提到; “然后它发送此令牌和请求的某些特征的哈希来验证请求,例如sha1(令牌+时间戳+请求URL+请求正文)。您的服务器可以对此进行验证,而客户端不必在每个请求上以纯文本发送令牌。” 另一个问题是,一旦服务器接收到这个令牌的哈希值(包括时间戳和用户ID等),服务器如何在没有存储令牌的查找表或数据库的情况下从这个令

    • 身份验证 PDF版下载 企业应用中的URL链接可以通过OAuth2.0验证接口来获取员工的身份信息。 通过此接口获取员工身份会有一定的时间开销。对于频繁获取员工身份的场景,建议采用如下方案: 企业应用中的URL链接直接填写企业自己的页面地址; 员工跳转到企业页面时,企业校验是否有代表员工身份的cookie,此cookie由企业生成; 如果没有获取到cookie,重定向到OAuth验证链接,获取员工

    • 它总是导致带有错误消息的catch块 登录失败:未知的用户名或错误的密码。失败:未知的用户名或错误的密码。 我确信给定的密码是正确的。 如何使用给定的密码验证用户名?

    • 15/02/06 15:17:12警告IPC.Client:连接到服务器时遇到异常:javax.security.sasl.saslexception:GSS initiate失败[由GSSException:未提供有效凭据(机制级别:找不到任何Kerberos tgt导致)]LS:本地异常失败:java.io.ioException:javax.security.sasl.saslexcepti

    • 一切都一直在工作,只是今天我开始得到一个错误消息,我甚至不能从Android工作室“同步项目与Gradle文件”。我唯一改变的是...办公室:D