我正在尝试使用支持NFC的安卓手机作为钥匙卡来构建一个支持NFC功能的智能门。我使用的是NodeMcu和RC522 NFC阅读器。下面的代码适用于读取经典RFID卡。当我读到手机的RFID时,手机的RFID一直在变化。
-
为什么手机的RFID会不断变化?
-
如果这是无法预防的,我可以使用NFC从安卓手机向RC522发送诸如"你好世界"之类的信息吗?
#include <SPI.h> //SPI kütüphanemizi tanımlıyoruz. #include <MFRC522.h> //MFRC522 kütüphanemizi tanımlıyoruz. #include <LiquidCrystal.h> LiquidCrystal lcd(7, 6, 5, 4, 3, 2); int RST_PIN = 9; //RC522 modülü reset pinini tanımlıyoruz. int SS_PIN = 10; //RC522 modülü chip select pinini tanımlıyoruz. int buzzerPin = 8; //Buzzer motor pinini tanımlıyoruz. MFRC522 rfid(SS_PIN, RST_PIN); //RC522 modülü ayarlarını yapıyoruz. void setup() { Serial.begin(9600); //Seri haberleşmeyi başlatıyoruz. SPI.begin(); //SPI iletişimini başlatıyoruz. rfid.PCD_Init(); //RC522 modülünü başlatıyoruz. pinMode(buzzerPin,OUTPUT); lcd.begin(16, 2); lcd.print("CARD READER!"); } void array_to_string(byte array[], unsigned int len, char buffer[]) { for (unsigned int i = 0; i < len; i++) { byte nib1 = (array[i] >> 4) & 0x0F; byte nib2 = (array[i] >> 0) & 0x0F; buffer[i*2+0] = nib1 < 0xA ? '0' + nib1 : 'A' + nib1 - 0xA; buffer[i*2+1] = nib2 < 0xA ? '0' + nib2 : 'A' + nib2 - 0xA; } buffer[len*2] = ' '; } void loop() { if ( ! rfid.PICC_IsNewCardPresent()) //Yeni kartın okunmasını bekliyoruz. return; if ( ! rfid.PICC_ReadCardSerial()) //Kart okunmadığı zaman bekliyoruz. return; char cardInput[32] = ""; rfid.PICC_DumpDetailsToSerial(&(rfid.uid)); //dump some details about the card array_to_string(rfid.uid.uidByte, 4, cardInput); //Insert (byte array, length, char array for output) printCardToScreen(cardInput); lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,0); lcd.print(cardInput); digitalWrite(buzzerPin,HIGH); delay(1000); digitalWrite(buzzerPin,LOW); delay(5000); lcd.print(" "); lcd.setCursor(0,0); lcd.print("CARD READER!"); rfid.PICC_HaltA(); } void printCardToScreen(String cardInput){ Serial.print("ID Numarasi: "); Serial.print(cardInput); Serial.print(" "); Serial.println(""); }
将RFID UID用于任何安全应用程序都是一个非常糟糕的主意,因为它不能保证为唯一,尤其是当您似乎在寻找4字节的UID时。
由于4个字节中没有足够的组合,许多卡类型已转移到7个字节的UID。有些卡类型的UID是用户可编程的,而对于某些卡类型,如Mifare Classic卡,UID应该在工厂编程,有允许更改UID的中文克隆
使用模拟卡(这是安卓手机正在做的事情(,返回的UID可以很容易地编程为任何值。
UID仅用于在多张卡同时在读卡器范围内时帮助区分一张卡和另一张卡,因此,只需要多张卡可能具有不同的UID,而手机中的随机数极有可能实现这一点。即使这样,2个UID相同的后果也很小,只是读卡失败。
这让我明白了为什么默认会更改UID,这可能是一种隐私功能,因此它不能用于跟踪手机,因为NFC被认为是一种不需要其他类型保护的非危险设施。
安全应用程序的一种更好的方法是使用存储在卡存储器(或模拟卡存储器(上的数据加密来进行识别。