簡體   English   中英

NTAG213設置密碼

[英]Setting password for NTAG213

我正在嘗試在 NFC 標簽(類型:NTAG213)中設置和檢查密碼,但在嘗試設置密碼時總是收到IOException (收發失敗)。

我不明白我必須為密碼和 ACK 包設置哪個頁面。 這是我用 Xamarin 用 C# 編寫的代碼。 請隨時以原生 Android Java 代碼回復。

var tag = intent.GetParcelableExtra (NfcAdapter.ExtraTag) as Tag;

String password = "pass";
byte[] array = System.Text.Encoding.ASCII.GetBytes (password);
MifareUltralight mifare = MifareUltralight.Get (tag);
mifare.Connect ();

byte[] result1 = mifare.Transceive(new byte[] {
        (byte)0xA2,  /* CMD = WRITE */
        (byte)0x2C,  /* PAGE = 44 */
        array[0], array[1], array[2], array[3] 
});

byte[] result2 = mifare.Transceive(new byte[] {
        (byte)0xA2,  /* CMD = WRITE */
        (byte)0x2A,  /* PAGE = 42 */
        (byte)array[0], (byte)array[1], (byte)0, (byte)0 
});

使用 NTAG213,密碼 (PWD) 和密碼確認 (PACK) 的正確頁面是:

  • 密碼:43( 0x2B
  • 包:44( 0x2C

因此,您正在嘗試寫入錯誤的頁面。 更具體地說,您試圖將非零值寫入 RFUI 字節(第 44 頁,第 2-3 頁和第 42 頁,第 1-3 頁),這可能會導致寫入操作失敗。

所以你通常想要做這樣的事情:

byte[] pwd = new byte[] { (byte)0x70, (byte)0x61, (byte)0x73, (byte)0x73 };
byte[] pack = new byte[] { (byte)0x98, (byte)0x76 };

// write PACK:
byte[] result = mifare.Transceive(new byte[] {
        (byte)0xA2,  /* CMD = WRITE */
        (byte)0x2C,  /* PAGE = 44 */
        pack[0], pack[1], 0, 0
});

// write PWD:
result = mifare.Transceive(new byte[] {
        (byte)0xA2,  /* CMD = WRITE */
        (byte)0x2B,  /* PAGE = 43 */
        pwd[0], pwd[1], pwd[2], pwd[3]
});

請注意,讓 PACK 成為 PWD 的子集沒有多大意義,因為攻擊者隨后能夠從 PWD 值中獲取 PACK 值。 PACK 值通常用作只有您和標簽“知道”的共享秘密,並且標簽發送以響應成功的身份驗證嘗試以證明它是真正的標簽。 (盡管這種方法存在很多安全問題。)

進一步注意,如果標記已經受到保護(密碼設置和身份驗證配置設置為保護 PWD/PACK),則設置 PWD/PACK 值將失敗(可能帶有IOException )。 在這些情況下,您需要先使用當前密碼進行身份驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM