能否锁定MIFARE 1k卡的命令、保护克隆或防止其他应用程序擦除?

7

我希望这样做是为了防止可擦写或克隆卡。我阅读了很多文件,有些文件告诉用户设置第四块的权限为读写。

根据 @Michael Roland 的说法:

MIFARE 卡的每个扇区的身份验证密钥和访问条件都位于该扇区的最后一块(扇区尾部)。您可以使用常规写入命令更新此块的新访问条件和身份验证密钥。

扇区尾部长这样:

+-----------------------------+--------------+----+-----------------------------+
|  0 |  1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 | 10 | 11 | 12 | 13 | 14 | 15 |
+-----------------------------+--------------+----+-----------------------------+
|            Key A            | Access Bits  | GP |            Key B            |
|          (6 bytes)          |  (3 bytes)   | B  |          (6 bytes)          |
+-----------------------------+--------------+----+-----------------------------+

因此,访问位位于第6-8字节,并且长这样:
        +-------+-------+-------+-------+-------+-------+-------+-------+
        | Bit 0 | Bit 1 | Bit 2 | Bit 3 | Bit 4 | Bit 5 | Bit 6 | Bit 7 |
        +-------+-------+-------+-------+-------+-------+-------+-------+
Byte 6: | nC2_3 | nC2_2 | nC2_1 | nC2_0 | nC1_3 | nC1_2 | nC1_1 | nC1_0 |
        +-------+-------+-------+-------+-------+-------+-------+-------+
Byte 7: |  C1_3 |  C1_2 |  C1_1 |  C1_0 | nC3_3 | nC3_2 | nC3_1 | nC3_0 |
        +-------+-------+-------+-------+-------+-------+-------+-------+
Byte 8: |  C3_3 |  C3_2 |  C3_1 |  C3_0 |  C2_3 |  C2_2 |  C2_1 |  C2_0 |
        +-------+-------+-------+-------+-------+-------+-------+-------+

Where nCx_y = not Cx_y and "C1_x, C2_x, C3_x" is the access condition for block x:

C1_3, C2_3, C3_3: sector trailer (block 3 in this sector)
C1_2, C2_2, C3_2: block 2 in this sector
C1_1, C2_1, C3_1: block 1 in this sector
C1_0, C2_0, C3_0: block 0 in this sector

我在进行的项目中是如何执行这项任务的

输入图像描述

输入图像描述

3个回答

2

您无法保护一张卡片免受自我复制。(暴力攻击方法在这种技术上很容易实施)

可以做的是对包括UID在内的所有块进行哈希,并将其存储在卡片上。在您的程序中,只需比较数据哈希与存储的哈希即可。

要在Python中实现基本哈希并将其存储在块中,可以使用双伪随机:

def CRYPT_hashage(data,UID):
    seed(str(data)+str(UID))
    seed(random())
return str(random()).replace("0.","")[:8]

它可以防止在另一张卡上进行克隆。用户仍然可以修改自己的卡片。但是,您可以使用相同的技术对“敏感”数据进行哈希。

在这两个安全措施之后,只剩下“自我克隆”技术,例如: - 您复制您的数据 - 您支付(用于无现金支付系统) - 您将旧数据粘贴到您的卡上)

唯一的方法是将所有数据存储在服务器上,仅使用卡的UID作为主键。

存在可以更改UID的卡片。


就像你所说的,这取决于不可更改的UID,并且使用那种可变的UID,他们几乎能够克隆整个Mifare Classic卡。那么,使用Mifare Classic就没有安全保障了。 - Mahmoud Hosseinipour

1
你可以使用A或B密钥来保护每个扇区。
话虽如此,Mifare Classic卡的安全性已经被攻破。你真的无法保护任何东西。

1

最终,我解决了这个问题。

为此,我们需要更改第四块每个扇区中的访问位。

例如,对于第5个扇区

就像对于第5个扇区,我们需要更改其23个块的访问位一样。

我们需要首先验证第5个扇区...

默认密钥为

byte keya[] = { (byte) 0xFF,(byte) 0xFF,(byte) 0xFF,(byte) 0xFF,(byte) 0xFF,(byte) 0xFF};

这是关于编程的内容,第一个000000000000FF078069FFFFFFFFFFFF是什么意思?

第6位是A密钥,其值为000000000000,最后6位是B密钥,其值为FFFFFFFFFFFF,均为十六进制字符串。

FF078069 是访问位的十六进制字符串。

所以,要更改它,我们需要实现以下步骤:首次需要使用默认密钥进行身份验证。

  MifareClassic mfc = MifareClassic.get(tag);

        try {
            mfc.connect();
            auth = mfc.authenticateSectorWithKeyA(5, 
 MifareClassic.KEY_DEFAULT);
        if(auth)
        {
         String nkeya = "key123";// 6 length only
                nkeya = toHex(nkeya).toUpperCase();
                nkeya = nkeya.substring(28,40);

                String nkeyb = "key123"; // 6 length only
                nkeyb = toHex(nkeyb).toUpperCase();
                nkeyb = nkeyb.substring(28,40);

                String nkey = nkeya+"FF078069"+nkeyb;
                int len = nkey.length();

                byte[] nkeyab = new BigInteger(nkey, 16).toByteArray();
                // 5 is sector and 5*4+3 is fourth block of sector 5
                mfc.writeBlock((5*4)+3,nkeyab);

}
catch(Execption e)
 {
 }

成功设置写保护后,默认身份验证失败 因此,我们需要使用我们创建的访问密钥进行身份验证

try {
 MifareClassic mfc = MifareClassic.get(tag);
 String key = getKeya();

 key = toHex(key).toUpperCase();
  int len = key.length();
   key = key.substring(28,40);
   keya = new BigInteger(key, 16).toByteArray();

  //for key A or for Keb b


            mfc.connect();
            auth = mfc.authenticateSectorWithKeyA(5, keya);
        if(auth)
        {


  byte[] readblock4=    mfc.readBlock(20);

  }
  }
 catch(Exeption e)
 {

 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接