You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编程RFID标签实现读卡器值匹配验证,防护RFID-RC522数据克隆?

实现RFID标签的读卡器值验证(无需读卡器写入)

首先明确:RC522模块常用的MIFARE系列标签(如MIFARE Classic 1K)本身不支持自定义逻辑编程,但可通过利用标签原生安全机制+预存验证值实现需求——仅当读卡器发送的验证值与标签预存值匹配时,才允许读取敏感数据,且全程无需读卡器向标签写入内容。

核心逻辑

所有验证配置在标签初始化阶段一次性完成(用开发板或编程器写入),后续读卡器仅能执行读/验证操作:

  1. 提前在标签特定扇区预存验证值,并配置该扇区访问权限:仅通过密钥认证+验证值匹配后,才能读取敏感数据,同时锁死所有写入权限。
  2. 读卡器端先完成密钥认证,再读取标签预存的验证值并比对,匹配成功才读取敏感数据。

具体操作步骤

1. 标签初始化(仅执行一次)

用Arduino+RC522完成标签的预配置:

  • 选择一个非厂商扇区(如扇区1),将自定义验证值(比如0x12,0x34,0x56,0x78)写入该扇区的某数据块(如块4)。
  • 配置扇区控制块:设置为仅用A密钥认证后可读取数据块,且禁止任何写入操作。

    注:MIFARE Classic每个扇区的末尾块是控制块,包含密钥和访问权限位,配置时需确保写入权限完全锁死。

2. 读卡器端验证与读取流程

读卡器按以下逻辑运行,全程无写入操作:

  • 检测到标签后,先发送预存的扇区A密钥完成认证。
  • 认证通过后,读取标签内的预存验证值。
  • 将读取到的值与读卡器本地预设的验证值比对,匹配成功才读取敏感数据块,不匹配则终止操作。

示例代码片段(Arduino+RC522)

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN 9
#define SS_PIN 10
MFRC522 mfrc522(SS_PIN, RST_PIN);

// 标签预存的验证值(初始化时写入)
byte storedValidation[] = {0x12, 0x34, 0x56, 0x78};
// 标签扇区1的A密钥(初始化时设置)
byte sectorKeyA[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

void setup() {
  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
}

void loop() {
  // 检测标签
  if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
    delay(50);
    return;
  }

  // 密钥认证
  MFRC522::StatusCode status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 4, sectorKeyA, &mfrc522.uid);
  if (status != MFRC522::STATUS_OK) {
    Serial.println("密钥认证失败,拒绝访问");
    mfrc522.PICC_HaltA();
    mfrc522.PCD_StopCrypto1();
    return;
  }

  // 读取验证值块
  byte readBuf[18];
  byte bufSize = sizeof(readBuf);
  status = mfrc522.MIFARE_Read(4, readBuf, &bufSize);
  if (status != MFRC522::STATUS_OK) {
    Serial.println("读取验证值失败");
    mfrc522.PICC_HaltA();
    mfrc522.PCD_StopCrypto1();
    return;
  }

  // 比对验证值
  bool isValid = true;
  for (int i = 0; i < 4; i++) {
    if (readBuf[i] != storedValidation[i]) {
      isValid = false;
      break;
    }
  }

  if (isValid) {
    Serial.println("验证值匹配,读取敏感数据");
    // 读取敏感数据块(如块5)
    status = mfrc522.MIFARE_Read(5, readBuf, &bufSize);
    if (status == MFRC522::STATUS_OK) {
      for (byte i = 0; i < bufSize; i++) {
        Serial.print(readBuf[i] < 0x10 ? " 0" : " ");
        Serial.print(readBuf[i], HEX);
      }
      Serial.println();
    }
  } else {
    Serial.println("验证值不匹配,拒绝读取");
  }

  // 终止操作
  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
}

关键注意事项

  • 初始化标签时必须锁死所有写入权限,防止未授权读卡器篡改验证值或敏感数据。
  • 验证值和密钥需严格保密,避免泄露导致安全失效。
  • 若使用MIFARE Ultralight等其他类型标签,核心逻辑一致,仅权限配置方式略有差异。

内容的提问来源于stack exchange,提问作者Moaz Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:01:56