Защитите свой проект Arduino: добавление защиты паролем с помощью клавиатуры

Вы работаете над проектом Arduino и хотите добавить дополнительный уровень безопасности? Одним из эффективных способов добиться этого является внедрение системы защиты паролем с использованием клавиатуры. В этой статье мы рассмотрим несколько способов добиться этого, предоставив вам примеры кода и простые инструкции. Давайте погрузимся!

Метод 1: базовая проверка пароля
Давайте начнем с простого метода, который проверяет заранее заданный пароль с помощью клавиатуры. В этом примере мы возьмем 4-значный цифровой пароль. Вот код:

#include <Keypad.h>
const int ROWS = 4;
const int COLS = 4;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Predefined password
char password[] = "1234";
void setup() {
  Serial.begin(9600);
}
void loop() {
  char key = keypad.getKey();

  if (key) {
    // Check if the entered key matches the password
    if (key == '#') {
      if (strcmp(password, enteredPassword) == 0) {
        // Password is correct, perform the desired action
        Serial.println("Access granted!");
      } else {
        // Password is incorrect
        Serial.println("Access denied!");
      }
// Reset the entered password
      enteredPassword = "";
    } else {
      // Append the entered key to the password
      enteredPassword += key;
    }
  }
}

Объяснение:
Этот метод использует библиотеку Keypadдля взаимодействия с клавиатурой. Мы определяем раскладку клавиатуры, контакты строк и столбцов. Функция loop()постоянно проверяет нажатия клавиш. Когда пользователь вводит ключ, он добавляется к переменной enteredPassword. Если пользователь нажимает «#», введенный пароль сравнивается с заранее заданным паролем. Если они совпадают, «Доступ разрешен!» печатается; в противном случае «Доступ запрещен!» отображается.

Метод 2: проверка пароля по времени
Другой подход — включить проверку пароля по времени. Этот метод требует от пользователя ввода кода, который периодически меняется в зависимости от времени. Вот пример использования библиотеки Time:

#include <Keypad.h>
#include <TimeLib.h>
const int ROWS = 4;
const int COLS = 4;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Secret key seed
unsigned long secretKeySeed = 12345678;
void setup() {
  Serial.begin(9600);
  setTime(0, 0, 0, 1, 1, 2000); // Set initial time
}
void loop() {
  char key = keypad.getKey();

  if (key) {
    if (key == '#') {
      unsigned long currentTime = now();
      unsigned long secretKey = secretKeySeed + (currentTime / 30); // Generate time-based secret key

      // Verify the entered key against the generated secret key
      if (keypadState() == secretKey) {
        // Password is correct, perform the desired action
        Serial.println("Access granted!");
      } else {
        // Password is incorrect
        Serial.println("Access denied!");
      }
    }
  }
}
unsigned long keypadState() {
  unsigned long state = 0;

  for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 4; j++) {
      state += analogRead(i * 4 + j);
    }
  }

  return state;
}

Объяснение:
В этом методе мы вводим элемент, основанный на времени, в процесс проверки пароля. Начальное значение секретного ключа объединяется с текущим временем для создания уникального секретного ключа, который меняется каждые 30 секунд. Функция keypadState()вычисляет значение на основе аналоговых показаний клавиатуры для создания уникального состояния. Это состояние сравнивается с сгенерированным секретным ключом, чтобы определить правильность введенного пароля.

Включив защиту паролем с помощью клавиатуры, вы можете повысить безопасность своих проектов Arduino. В этой статье мы рассмотрели два метода: базовую проверку пароля и проверку пароля по времени. В зависимости от требований вашего проекта вы можете выбрать метод, который лучше всего соответствует вашим потребностям. Помните, что безопасность имеет решающее значение, и эти методы обеспечивают прочную основу для защиты ваших проектов Arduino от несанкционированного доступа.