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')

Úgy tűnik, AdBlockert használsz, amivel megakadályozod a reklámok megjelenítését. Amennyiben szeretnéd támogatni a munkánkat, kérjük add hozzá az oldalt a kivételek listájához, vagy támogass minket közvetlenül! További információért kattints!

Engedélyezi, hogy a https://www.helloworldonline.hu értesítéseket küldjön Önnek a kiemelt hírekről? Az értesítések bármikor kikapcsolhatók a böngésző beállításaiban.