关于本工具
本工具专为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() {
// 主循环
}