ESP32 Arduino授权工具

关于本工具

本工具专为ESP32 Arduino开发设计,可实现MAC地址与授权码的相互转换。 您可以使用此工具为您的ESP32设备生成唯一授权码,或通过授权码验证设备身份。

本地加密计算
双向可逆转换
完全响应式设计

MAC转授权码

支持格式: 00:1A:2B:3C:4D:5E 或 001A2B3C4D5E

授权码转MAC

使用说明

获取ESP32 MAC地址

在Arduino IDE中使用以下代码获取ESP32的MAC地址:

void setup() {
  Serial.begin(115200);
  Serial.println(WiFi.macAddress());
}

void loop() {}

生成授权码

将获取的MAC地址输入到"MAC转授权码"表单中,可选择设置自定义密钥,然后点击"生成授权码"按钮。

验证授权码

将生成的授权码和密钥输入到"授权码转MAC"表单中,点击"还原MAC地址"按钮,验证还原的MAC地址是否与原始MAC一致。

ESP32 Arduino代码示例

授权验证示例代码

#include <WiFi.h>
#include <EEPROM.h>
#include <base64.h>
#include <SHA256.h>

// 替换为您的密钥
const char* SECRET_KEY = "your_secret_key_here";

// EEPROM中保存授权码的起始地址
const int AUTHORIZED_KEY_ADDRESS = 0;
const int AUTHORIZED_KEY_LENGTH = 20;

String generateAuthorizationKey(String macAddress) {
  // 移除MAC地址中的冒号
  macAddress.replace(":", "");
  
  // 将MAC地址转换为字节
  uint8_t macBytes[6];
  for (int i = 0; i < 6; i++) {
    macBytes[i] = (uint8_t)strtol(macAddress.substring(i*2, i*2+2).c_str(), NULL, 16);
  }
  
  // 生成密钥字节
  SHA256 sha256;
  sha256.update(SECRET_KEY);
  uint8_t* keyBytes = sha256.digest();
  
  // 执行异或操作
  uint8_t xorResult[6];
  for (int i = 0; i < 6; i++) {
    xorResult[i] = macBytes[i] ^ keyBytes[i];
  }
  
  // 添加盐值
  sha256.reset();
  sha256.update(String(SECRET_KEY) + macAddress);
  uint8_t* salt = sha256.digest();
  
  // 组合盐值和加密数据
  uint8_t dataWithSalt[10];
  memcpy(dataWithSalt, salt, 4);
  memcpy(dataWithSalt + 4, xorResult, 6);
  
  // Base64编码
  char encoded[20];
  base64_encode(encoded, (char*)dataWithSalt, 10);
  
  // 格式化授权码(无分隔符)
  String authKey = String(encoded);
  authKey.replace("=", "");
  authKey.replace("+", "-");
  authKey.replace("/", "_");
  
  return authKey;
}

bool verifyAuthorization(String inputKey) {
  String mac = WiFi.macAddress();
  String generatedKey = generateAuthorizationKey(mac);
  
  return generatedKey == inputKey;
}

void saveAuthorizationKey(String key) {
  EEPROM.begin(AUTHORIZED_KEY_LENGTH);
  for (int i = 0; i < key.length(); i++) {
    EEPROM.write(AUTHORIZED_KEY_ADDRESS + i, key[i]);
  }
  EEPROM.commit();
  EEPROM.end();
}

String readAuthorizationKey() {
  EEPROM.begin(AUTHORIZED_KEY_LENGTH);
  String key = "";
  for (int i = 0; i < AUTHORIZED_KEY_LENGTH; i++) {
    char c = EEPROM.read(AUTHORIZED_KEY_ADDRESS + i);
    if (c == '\0') break;
    key += c;
  }
  EEPROM.end();
  return key;
}

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  
  Serial.print("MAC地址: ");
  Serial.println(WiFi.macAddress());
  
  String savedKey = readAuthorizationKey();
  
  if (savedKey.length() > 0) {
    if (verifyAuthorization(savedKey)) {
      Serial.println("已授权,欢迎使用!");
    } else {
      Serial.println("保存的授权码无效,请重新输入。");
      // 清除无效的授权码
      saveAuthorizationKey("");
    }
  } else {
    Serial.println("请输入授权码进行验证:");
    while (Serial.available() == 0) {
      delay(100);
    }
    String inputKey = Serial.readStringUntil('\n');
    if (verifyAuthorization(inputKey)) {
      saveAuthorizationKey(inputKey);
      Serial.println("授权验证成功,授权码已保存!");
    } else {
      Serial.println("授权验证失败,请重新启动设备并输入正确的授权码。");
    }
  }
}

void loop() {
  // 主循环
}
操作成功!