Jak wskazuje autor projektu, jedynym sposobem na zachowanie prywatności naszych danych jest podniesienie kosztów nieautoryzowanego dostępu do nich tak wysoko, jak to tylko możliwe. Najlepiej, aby koszty te były wyższe niż jakiekolwiek zyski, jakie strona trzecia może uzyskać dzięki niepowołanemu dostępowi do tych danych. Takie postępowanie eliminuje motywację do uzyskiwania dostępu do naszych danych bez naszej zgody. Aby podnieść koszty nieautoryzowanego dostępu do danych, autor tego projektu zbudował urządzenie szyfrujące, które nazwał Midbar. Urządzenie to jest ostatnią generacją podobnych układów i korzysta z wcześniejszych doświadczeń autora.
Midbar pełni funkcję bezpiecznego magazynu haseł i kluczy. Jest on zabezpieczony kartą RFID przed niepowołanym dostępem. System składa się z dwóch urządzeń - bezpiecznego magazynu danych oraz odbiornika. Nazwa urządzenia - Midbar - to hebrajskie słowo oznaczające pastwisko, niezamieszkaną ziemię, pustynię, duże połacie dzikiej przyrody (wokół miast). Stały za tym dwa powody. Po pierwsze - pracując nad poprzednimi projektami, autor zauważył, że rynek urządzeń zabezpieczających dane osobowe w postaci zaszyfrowanej to właściwie pustynia wokół oazy menedżerów haseł. Po drugie - autor nie mógł znaleźć lepszego słowa na określenie tego projektu, na początku chciał go nazwać „Skarbcem haseł”, ale potem uznał, że to coś więcej niż tylko skarbiec haseł.
Potrzebne elementy
Do budowy magazynu kryptograficznego potrzebne będą następujące komponenty:
- moduł z mikrokontrolerem ESP32,
- 2,4-calowy ekran TFT LCD ze sterownikiem ILI9341,
- enkoder obrotowy EC11,
- klawiatura PS/2,
- złącze PS/2,
- 7× opornik 4,7 kΩ,
- 2× kondensator 100 nF,
- 2× przycisk,
- czytnik RFID Mifare RC522,
- karty RFID.
Do skonstruowania odbiornika potrzebne będą z kolei następujące podzespoły:
- moduł z mikrokontrolerem ESP32,
- 1,77-calowy wyświetlacz TFT LCD ze sterownikiem ST7735,
- klawiatura 4×4,
- kondensator 10 μF (opcjonalnie).
Cały zestaw komponentów został pokazany na fotografii 1.
Szyfrowanie 3DES + AES + Blowfish + Serpent
Do szyfrowania zapisywanych danych opisana konstrukcja używa szeregu algorytmów kryptograficznych, co ma zapewnić zwiększenie poziomu bezpieczeństwa - nawet gdyby okazało się, że któryś z algorytmów został złamany, to dane zapisane w systemie nadal pozostaną bezpieczne. Na rysunku 1 pokazano schematycznie zastosowane algorytmy szyfrowania. Powstało złożenie czterech algorytmów kodowania - 3DES, AES, Blowfish i Serpent. Dodatkowo algorytm pracuje w tzw. trybie CBC, czyli trybie wiązania bloków zaszyfrowanych. Szyfrowany tekst jest dzielony na bloki, w tym przypadku po 10 znaków i szyfrowany w taki sposób, że kolejne bloki wiązane są ze sobą za pomocą sprzężenia zwrotnego.
Zastosowanie bloków wiązanych sprawia, że jeżeli atakujący poda nieprawidłowy nawet jeden kod do jednego bloku, to nie będzie w stanie uzyskać dostępu także do kolejnych bloków danych, gdyż te do dekodowania wykorzystują część poprzedniego bloku. Oznacza to, że bez uzyskania całkowitego dostępu do pamięci nie można odkodować zapisanych danych, ale także gwarantuje to, że jeżeli jakikolwiek blok zaszyfrowanego tekstu zostanie podmieniony, to będzie to od razu widoczne podczas dekodowania zapisanych danych.
Instalacja sterowników i konfiguracja Arduino IDE
Jeśli nie programowaliśmy wcześniej modułów ESP32 w środowisku Arduino, koniecznie musimy skonfigurować nasze IDE i zainstalować wymagane sterowniki. W pierwszej kolejności musimy zainstalować sterowniki dla konwertera USB-UART, zależnie od tego, jaki jest zastosowany w naszym module:
- Sterownik dla układów CP210x znaleźć można na: http://bit.ly/35cQPrE.
- Sterowniki dla układów CH340 dla Arduino znaleźć można na: https://sparks.gogo.co.nz/ch340.html.
Jeśli nie mamy zainstalowanego Arduino IDE, pobrać je można ze strony domowej www.arduino.cc. Konfiguracja tego IDE wykracza poza ramy tego artykułu, ale na szczęście w sieci jest bardzo dużo poradników, opisujących, jak zainstalować i przygotować Arduino IDE do pracy oraz jak je skonfigurować do kompilowania i programowania modułów z układem ESP32.
Firmware
Firmware omawianego urządzenia można pobrać z jednego z trzech repozytoriów (adresy do nich znajdują się na końcu artykułu):
- SourceForge,
- OSDN,
- GitHub.
Jak sugeruje autor, jeżeli potrzebujemy tylko samego oprogramowania układowego dla Midbar w najnowszej wersji (4.0) i generatora liczb losowych, to najlepiej pobrać je z SourceForge lub OSDN, gdzie paczka ważyć będzie około 0,9 MB. Jeśli jednak chcemy także poznać firmware starszych wersji wraz z pomocniczymi materiałami, zdjęciami itd., to najlepiej jest pobrać pełną paczkę z GitHuba (118 MB). Z uwagi na rozległość oprogramowania (ponad 10 tysięcy linii w samym szkicu Arduino dla magazynu danych i prawie 600 w szkicu dla odbiornika) nie będziemy prezentować listingów w artykule.
Instalacja bibliotek
Aby poprawnie skompilować pobrane firmware, konieczne jest zainstalowanie szeregu bibliotek w środowisku Arduino IDE. Najwygodniej pobrać je z repozytoriów na GitHubie:
- TFT_eSPI: https://github.com/Bodmer/TFT_eSPI (biblioteka do obsługi ekranu TFT),
- PS2KeyAdvanced: https://github.com/techpaul/PS2KeyAdvanced (biblioteka do obsługi klawiatury PS/2),
- PS2KeyMap: https://github.com/techpaul/PS2KeyMap (pomocnicza biblioteka do obsługi klawiatury PS/2),
- EncButton: https://github.com/GyverLibs/EncButton (biblioteka do obsługi enkoderów i przycisków),
- RFID: https://github.com/miguelbalboa/rfid (biblioteka do obsługi odbiornika RFID),
- Adafruit-GFX-Library: https://github.com/adafruit/Adafruit-GFX-Library (biblioteka graficzna - jest używana do renderowania ładniejszej grafiki menu),
- Adafruit_BusIO: https://github.com/adafruit/Adafruit_BusIO (warstwa abstrakcji dla interfejsów I²C i SPI),
- Adafruit-ST7735-Library: https://github.com/adafruit/Adafruit-ST7735-Library (biblioteka obsługująca ST7735),
- Keypad: https://github.com/Chris--A/Keypad (biblioteka do obsługi klawiatury numerycznej).
Instalacja bibliotek jest bardzo prosta. Wystarczy w zasadzie wypakować je do folderu ...\Arduino\libraries lub w Arduino IDE wybrać z menu Sketch → Include Library → Add .ZIP Library... i wybrać archiwa ze spakowanymi bibliotekami, jedna po drugiej.
Modyfikacja biblioteki TFT_eSPI
Biblioteka TFT_eSPI wymaga dostosowania konfiguracji w zależności od konkretnego wyświetlacza i płytki go obsługującej. Modyfikacja tej biblioteki ogranicza się do podmiany pliku User_Setup.h z repozytorium ESP32_Version\V4.0 w folderze C:\Program Files (x86)\Arduino\libraries\TFT_eSPI-master (zakładając, że zainstalowaliśmy Arduino IDE w domyślnej lokalizacji).
Instalacja systemu plików na ESP32
Główną rolą system plików na ESP32 jest umożliwienie wgrywania plików do pamięci tego modułu przez zewnętrzne narzędzia. W tym projekcie zastosowano pusty obraz SPIFFS, wgrany do ESP32. Aby wgrać system do układu, należy pobrać plik ESP32FS-1.0.zip z repozytorium na GitHubie (https://github.com/me-no-dev/arduino-esp32fs-plugin/releases/), a następnie wypakować go do folderu ...\Arduino\Tools\ po czym należy zrestartować środowisko Arduino IDE.
Teraz mamy dostęp do narzędzi systemu plików. W menu (rysunek 2) wybieramy opcję No OTA (2MB APP/2MB SPIFFS), zanim będziemy kontynuować pracę z ESP32. Wybór tej opcji jest konieczny, ponieważ firmware magazynu haseł jest zbyt duże, aby zmieściło się w pamięci układu wraz z domyślną partycją.
Formatowanie pamięci
Aby sformatować pamięć w ESP32, który zostanie użyty w magazynie, należy podłączyć go do komputera, a z narzędzi w Arduino IDE wybrać odpowiedni szkic (rysunek 3), który załadujemy. Musimy tylko potwierdzić, że chcemy wyczyścić pamięć modułu, a program sformatuje wbudowaną pamięć Flash.
Działa to bez problemu z większością modułów… Jeśli jednak z jakiegoś powodu nasza płytka nie chce dać się sformatować z poziomu poprawnie skonfigurowanego IDE, być może musimy skorzystać z prostej sztuczki. Oczywiście należy najpierw upewnić się, że wszystko w IDE jest poprawnie skonfigurowane, zainstalowano odpowiednie sterowniki, wybrano poprawny port itd. Jeżeli mimo to dostajemy ciągle błąd Failed to connect to ESP32: Timed out waiting for packet header, należy podłączyć kondensator 10 μF do płytki na czas operacji. Włączamy go pomiędzy wyprowadzenie EN modułu ESP32 (dodatni biegun kondensatora) a masę modułu. Nie zapomnijmy o odłączeniu kondensatora po sformatowaniu pamięci modułu.
Generowanie kluczy
Aby nieautoryzowane odszyfrowanie danych przechowywanych w magazynie było obliczeniowo niemożliwe - kluczowe jest wygenerowanie własnych kluczy i nieużywanie ich ponownie - klucze są jednorazowe. Sposób generowania kluczy zależy wyłącznie od nas - można wymyślać je samodzielnie, wygenerować losowo itp. Autor zastosował jeden ze swoich starszych projektów, aby działał jako generator liczb losowych. Wygenerowane w ten sposób dane wyjściowe wydają się wystarczająco losowe, ale nie przeprowadził on żadnych testów, nie może więc zagwarantować, że wygenerowane dane są na pewno w pełni losowe. Generator ten znajduje się w repozytorium w folderze ESP32_Version\V4.0\Untested RNG. Uruchamiamy gen.exe i wybieramy przycisk Generate keys for Midbar V4.0 (rysunek 4).
Montaż elektryczny magazynu i odbiornika
Montaż magazynu nie powinien nastręczać wielkich problemów. Jak wskazuje autor, największym problemem jest montaż enkodera wraz z jego peryferiami. Schemat układu pokazano na rysunku 5. Oporniki 4,7 kΩ można zamienić dowolnymi rezystorami o oporze od 4,7 kΩ do 10 kΩ. Kondensatory pokazane mogą mieć od 22 nF do 100 nF pojemności.
Odbiornik jest konstrukcją jeszcze prostszą niż sam magazyn. Na rysunku 6 pokazano schemat tego modułu. Składa się on z wyświetlacza i prostej klawiatury membranowej, podłączonych do modułu z układem ESP32.
Odbiornik i magazyn zasilane są z portu USB modułu ESP32. Mogą one być zasilane z powerbanku, zasilacza wtyczkowego a nawet komputera.
Modyfikacja i programowanie firmware modułów
Aby zaprogramować magazyn haseł, musimy nieznacznie zmodyfikować jego firmware. Musimy tam wpisać unikalny adres MAC odbiornika. Aby go uzyskać, ESP32 w odbiorniku zaprogramować musimy poniższym krótkim skryptem:
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println(WiFi.macAddress());
}
void loop() {
}
Następnie podłączamy do modułu terminal szeregowy i resetujemy układ. W ten sposób po uruchomieniu zwróci on numer MAC, na przykład 94:E6:86:37:FF:D8.
Mając ten adres sprzętowy i wygenerowane wcześniej klucze, otwieramy szkice Arduino magazynu (Firmware_for_vault.ino) oraz odbiornika (Firmware_for_receiver.ino) i wpisujemy tam zebrane dane. Odbiornik potrzebuje tylko trzech kluczy (hmackey_for_session_key, projection_key, proj_serp_key). Adres MAC wpisujemy w szkicu magazynu (Firmware_for_vault.ino) w linii:
Teraz możemy wgrać firmware do odbiornika i magazynu.
Uruchomienie i konfiguracja systemu
Ostatnim etapem jest konfiguracja magazynu i zapełnienie go szyframi. Jest to trochę bardziej skomplikowane niż w przypadku starszych konstrukcji autora. Pierwszą zauważalną zmianą jest obecność animowanego menu i ekranu powitania. Po załadowaniu się ekranu powitania urządzenie uruchamiamy za pomocą kart RFID. Zbliżamy do czytnika cztery karty RFID - jedną po drugiej - aby odblokować Midbara. Istotne jest, aby za każdym razem zachować taką samą kolejność kart. Można też przybliżyć cztery razy tę samą kartę lub w dowolny inny sposób aktywować czytnik kart cztery razy.
Następnie w systemie podajemy główne hasło. Wprowadzamy je przez klawiaturę podłączoną do portu PS/2, sterując urządzeniem za pomocą enkodera. Tego hasła nie można zmienić bez sformatowania całego urządzenia i przywrócenia go do ustawień fabrycznych. Teraz naszym oczom ukazuje się główne menu urządzenia. Sterowanie w menu odbywa się za pomocą klawiatury - strzałek, entera i klawisza escape lub enkodera obrotowego. Teraz możemy dodawać, edytować i kasować loginy i hasła do magazynu szyfrów, a następnie je odczytywać lub przesyłać do odbiornika. Jeśli podłączymy urządzenie do komputera PC, Midbar może wprowadzać hasła do komputera. Teoretyczny zasięg odbiornika do 200 metrów. Autor testował przesyłanie haseł nawet do 200 znaków.
Podsumowanie
Jak pisze sam autor, jakkolwiek wadliwy i niedoskonały byłby Midbar, to urządzenie to działa w sposób kompletny - obsługuje klawiaturę PS/2, pokazuje animację ekranu blokady z odpowiednią szybkością i ma bezpieczny kanał komunikacji. Jeśli chodzi o funkcje szyfrowania, układ można zaszyfrować, a następnie odszyfrować 30-znakowym ciągiem za pomocą algorytmu szyfrowania z prawidłowo działającą funkcją weryfikacji integralności. Dodatkowo, zaprezentowana wersja urządzenia korzysta z kart RFID.
Układ ten nie może dać 100% gwarancji na ochronę naszych danych, ale w ich ochronie chodzi o to, aby koszt nieautoryzowanego dostępu do nich był jak najwyższy i to właśnie z powodzeniem realizuje Midbar.
Konstrukcja jest w pełni otwarta, więc każdy może wprowadzić w systemie własne zmiany czy ulepszenia. Autor zachęca do tego, gdyż wszystkie ulepszenia układu sprawią, że dostęp do chronionych szyfrowaniem danych będzie trudniejszy dla niepowołanych osób, a poprawa ergonomii korzystania z układu sprawi, że będziemy częściej korzystać z tego układu do bezpiecznego przechowywania naszych haseł.
Nikodem Czechowski, EP
Bibliografia: