2011-05-16 129 views
1

用Android來保護Mifare Ultralight非常容易,對此有一個Ndef.makeReadonly()方法。但Mifare Classic標籤返回Ndef.canMakeReadonly() == false,所以這是不可能的。我聽說可以只讀標籤,或者至少通過設置a或b鍵來保護它。如何保護包含NDEF消息的Mifare Classic標籤?

有此methid在MifareClassic科技:authenticateSectorWithKeyB(int sectorIndex, byte[] key)

有誰知道這是否可以用來做一個NDEF消息對MIFARE經典標籤只讀?或者,我還可以在標籤上寫入ndef消息,然後以某種方式將其鎖定爲新寫入?

回答

8

可以使用驗證方法。

首先,這裏是爲MIFARE經典4K數據表:

總之一寫保護是這樣的:

Mifare Classic分爲4 * 16個字節的扇區(只適用於前1K左右......更高的區塊有點不同,但在規範中有記載)。其中64個字節用於認證/保護。對於該卡的每個扇區,你做到以下幾點:

  1. 驗證使用科亞
  2. 讀取扇區尾部的扇區。
  3. 修改扇區尾部的訪問位。
  4. 將扇形拖車寫回卡上。

爲的Mifare經典的KEYA值是:

字節[] KEY_DEFAULT = {(字節)爲0xFF,(字節)爲0xFF,(字節)爲0xFF,(字節)爲0xFF,(字節) 0xFF時,(字節)爲0xFF};

對於未格式化的工廠新鮮卡片。

字節[] KEY_MIFARE_APPLICATION_DIRECTORY = {(字節)0XA0,(字節)0xA1,(字節)0xA2,(字節)0xA3執行,(字節)0xA4,(字節)0xA5的};

對於卡的第一個扇區

字節[] KEY_NFC_FORUM =
{(字節)0xD3,(字節)0xF7,(字節)0xD3,(字節)0xF7,(字節) 0xD3,(字節)0xF7};

對於所有其他部門。

重要提示:您必須將原始KeyA密鑰寫回卡中。如果這些與上面顯示的鍵不同,則卡將不再符合Ndef標準。

對於變形訪問位你有兩個選擇:

  1. 只允許讀的科亞。這會給你100%的寫保護,不能被撤銷。

  2. 啓用KeyA的讀取和KeyB的讀取/寫入。還將密鑰存儲在KeyB中。這將允許您使用您的密鑰KeyB對卡進行保護來驗證寫保護扇區。

背景:Android只會使用上面顯示的KeyA值驗證Ndef格式標籤。 Ndef檢測代碼從不嘗試使用KeyB,因此您可以將KeyB用於您自己的目的。

+1

Thanx爲您的答覆。雖然這可能確實有效,但我覺得它確實很複雜。有誰知道如果使用makeReadOnly()來支持密碼保護標籤也會在未來使用Mifare標籤(例如未來的Android版本)嗎?或者是否有人知道那裏會有這樣的庫? – 2011-05-23 18:30:44

+0

好的答案,ndef數據可以通過正常的ndef讀寫從多個受保護的塊中讀寫嗎? Ndef.writeNdefMessage寫入並使用getNdefMessage獲取消息? – gaara87 2013-01-29 09:32:01

+0

它解決了我的問題...謝謝你的解釋.. – 2014-09-26 09:51:28