Arduino-suli: jelszó, gépelés nélkül
Egyetlen gombnyomással a helyükre lehet illeszteni a belépési információkat. Hogy ebben miként segíthet az Arduino? Tarts velünk, és meglátod.
Számos hardveres és szoftveres védelmet kínál a Windows, ám a legizgalmasabb úgy felállítani valamilyen kiegészítő biztonsági korlátot, hogy teljes egészében saját kezűleg programozod a komponenseket. Az Arduino épp ebben remekel, ugyanis rengeteg olyan bővítőlapka szerezhető be hozzá, amelyeket ügyesen programozva - vagy akár kombinálva - egy megbízhatóan működő plusz autentikáció beemelésére is képes leszel.
Ehhez azonban alaposan be kell vásárolni kiegészítőkből, amelyekért sokszor egészen magas árat kérnek a gyártók. Persze ha kellően kreatív vagy, akkor az sem jelent akadályt, ha csak a "csupasz" mikrovezérlő áll a rendelkezésedre; a továbbiakban mi is egy ilyen minimális kiegészítőigényű megoldással foglalkozunk.
Ezt aztán a későbbiekben akár tovább is fejlesztheted, amennyiben megfelelő komponensekkel bővül a mikrokontrolleredhez csatolható hardverelemek gyűjteménye. Egy olyan program elkészítésén vezetünk végig, amely az Arduinóról gombnyomásra a gépedre küldi az eltárolt jelszót, és egy újabb lenyomást követően a vágólapról be is illeszti azt az épp kijelölt mezőbe.
Erre lesz szükséged
Ami a hardveres kiegészítőket illeti, alapvetően elég rövid bevásárlólistát kell csak írnod, a feladat ugyanis nem igényel egyebet, mint magát a mikrovezérlőt, egy ahhoz csatlakoztatható gombot, valamint egy adatkábelt. A szoftverekkel ellenben nincs ilyen szerencsénk, jó néhány kell majd belőlük a sikerhez.
Első lépésként telepítsd és konfiguráld az Arduino fejlesztői környezetét, amelyben minden funkció rendelkezésedre áll majd, hogy a mikrovezérlőre szánt programot elkészítsd, az UNO-ról érkező adatok azonban legfeljebb a soros monitorig jutnak el. Éppen ezért elengedhetetlen a számítógépeden egy kis szkript, amely képes a beérkező információkat feldolgozni és a szükséges utasításokat kiosztani. Ehhez bátran használhatod a Python programnyelvet, amely a megfelelő komponensekkel kiegészítve ténylegesen gyerekjátékká teszi ezt a folyamatot.
Ha ránk hallgatsz, egy 3-as főverziójú csomagot telepítesz a számítógépedre, ehhez mindent megtalálsz a python.org honlapon (természetesen annak sincs akadálya, hogy a legfrissebb változattal próbálkozz.Ezek után nyiss meg egy parancssori ablakot, és ellenőrizd a Python csomagtelepítőjének zavartalan üzemelését a pip -version utasítás segítségével (amennyiben itt nem kapsz eredményt, akkor a python -m ensurepip --default-pip segítségével telepítsd ezt a komponenst).
Ezt követően már elkezdheted a szükséges csomagok letöltését és installálását. Kezdd a soros monitor elérését garantáló pyserial alkalmazással (a pip install pyserial parancsot használva), majd jöhet a vágólap kezelését elősegítő pyperclip csomag (pip install pyperclip), végezetül pedig a gombok is igényelnek hozzáférést, emiatt fontos, hogy a pyautoguiról se feledkezz meg (pip install pyautogui).
Ha esetleg valamilyen probléma merül fel telepítés közben, a parancssori leírásban részletesen megtalálod, hogy miért akadt el a másolás folyamata, és egyszerűen kijavíthatod a hibákat.
Kód a mikrovezérlőre
Indítsd el az Arduino fejlesztői környezetét, nyiss meg egy új projektet, majd ellenőrizd a portok elérhetőségét. Ha mindezzel megvagy, hozz létre a kódod elején néhány változót, amelyek segítenek majd a feladat végrehajtásában. Elsőként azt a portot nevesítsd, amelyhez a gombot csatoltad (const int gomb=2;), majd jöhet egy szám típusú változó, amelyben a billentyűd aktuális állapotát jeleníted meg (int gombStatusz = 0;), illetve egy szöveges változó, ahol a jelszavadat eltárolod (String jelszo="jelszo";). Kezdetben nem is kell egyéb, mint ez a három érték, szóval már fejest is ugorhatsz a setup() függvény belsejébe.
Itt mindössze két kiegészítést kell megtenned: az egyikkel élesíted a 9600-as porton a soros monitort (Serial.begin(9600);), a másikkal pedig megjelölöd bemenetként a gombot (pinMode(gomb, INPUT);). Amint ezekkel a sorokkal is kibővült a programod, áttérhetsz a loop() függvénybe.
Minden ciklus elején ellenőrizd, hogy a gomb épp lenyomva vagy felengedve várja a történéseket (gombStatusz = digitalRead(gomb);). Amennyiben a felhasználó a billentyűt lenyomva tartja (if (gombStatusz == HIGH){}), a soros monitorra írd ki a jelszavadat, és állíts be egyetlen másodpercnyi késleltetést (Serial.println(jelszo); delay(1000);), ellenkező esetben egy alacsonyabb várakoztatást követően ugorj a loop végére (else{ delay(100); }). Ha most feltöltöd a kódot a mikrovezérlőre, rögvest tesztelheted is a szoftver működését.
Jöhet a kígyó!
Python-kódod létrehozása során tetszőlegesen használhatsz fejlesztői környezetet is, mi az egyszerűség kedvéért a Notepad++ (notepad-plus-plus.org/downloads) segítségével készítettük el a mintaállományt. A kód első három sorába emeld be azokat a csomagokat, amelyeket előzőleg hozzáadtál a Python könyvtárához (import serial import pyperclip import pyautogui). Alattuk aktiváld a soros monitor figyelését a ser = serial.Serial('portszám', 9600, timeout=.1) utasítással, ahol a 'portszám' érték helyét annak a kommunikációs portnak kell elfoglalnia, amelyen keresztül a mikrovezérlőd kapcsolatba lép a számítógépeddel (ezt az információt az Arduino IDE-ablakának jobb alsó sarkában találod). Indíts el egy végtelen ciklust (while True:), majd egy kis behúzással alatta olvasd be a soros monitorról érkező információkat (data = ser.readline()[:-2]). Amennyiben itt kaptál értéket (if data:), akkor írasd is ki a képernyőre (print(data)). Mentsd el az állományt test.py néven, és navigálj abba könyvtárba egy parancssori ablakkal, ahonnan futtatni szeretnéd, majd a py test.py utasítással indítsd is el.
Ha mindent megfelelően végrehajtottál, akkor amint a mikrovezérlődön megnyomod a gombot, a parancssorban megjelenik az általad megadott belépési kulcs; tehát az információ sikeresen átérkezett erre a felületre. Ezzel persze még nem értél a fejlesztés végére, hiszen az is a céljaink között szerepel, hogy az említett adat átkerüljön a vágólapra is. Szerencsére ez nem igényel túl sok kiegészítést, mindössze szöveggé kell konvertálnod a password=data.decode("utf-8") paranccsal, majd a pyperclip.copy(password) segítségével kimásolnod a karaktersorozatot. Egy új indítást követően a kiírás továbbra is megtörténik minden gombnyomást követően, ha azonban egy beviteli mezőben most a CTRL+V billentyűkombinációt használod, akkor már a jelszóként megadott szöveg jelenik meg.
Illeszd a helyére!
Ha nem csupán a másolást szeretnéd automatikusan elvégezni, hanem még a beillesztést is egyetlen gombnyomással hajtanád végre, akkor van egy remek hírünk: mindezt elérheted az eredeti kód néhány apró módosításával. Az Arduino IDE-felületén egy extra globális változóra lesz szükséged, amivel a gombnyomásokat tartod nyilván (int gombNyomas=0;). Ennek köszönhetően annyiban változik az eredeti feltételed, hogy ezeket az értéket is figyeli majd.
Nullás adat esetén (gombStatusz == HIGH && gombNyomas==0), azaz az első gombnyomásra az eredeti jelszóküldési folyamat fut le annyival kibővítve, hogy a gombNyomas értékét is növeled a végén (gombNyomas++;). Egy további ágként bejön az egyes érték vizsgálata is (else if(gombStatusz == HIGH && gombNyomas==1)); ha ide fut a kód, akkor egy beillesztes feliratot küldesz a soros monitorra, szintén másodperces késleltetéssel megtoldva (Serial.println("paste"); delay(1000);). Az else ágat változatlanul hagyjuk, tehát a kódot fel is töltheted a mikrovezérlőre.
A test.py állomány kódjában a print után kell egy elágazást indítanod, amelyben azt figyeled, hogy mi a beérkezett adat szövege. Amennyiben nem "beillesztes" (if data.decode("utf-8")!='beillesztes':), úgy a vágólapra küldöd az információt, míg az else ágban a pyautogui.hotkey('ctrl', 'v') bevetésével végrehajtod a beszúrást. Így tehát az Arduinón tárolt jelszavadat egyetlen gombnyomással a gépedre küldheted, majd egy újabb gombnyomással egy szöveges mezőbe helyezheted.
Arduino-kód
const int gomb=2; String jelszo="jelszo"; int gombStatusz = 0; int gombNyomas=0;
void setup() {Serial.begin(9600);pinMode(gomb, INPUT);}
void loop() { gombStatusz = digitalRead(gomb);
if (gombStatusz == HIGH && gombNyomas==0){ Serial.println(jelszo); delay(1000); gombNyomas+=1; }else if(gombStatusz == HIGH && gombNyomas==1){ Serial.println("beillesztes");delay(1000); }else{ delay(100); }}
Python-kód
import serial
import pyperclip
import pyautogui
ser = serial.Serial('COM3', 9600, timeout=.1)
while True:
data = ser.readline()[:-2]
if data:
print(data)
if data.decode("utf-8")!='beillesztes':
password=data.decode("utf-8")
pyperclip.copy(password)
else:
print(password)
pyautogui.hotkey('ctrl', 'v')