Avtor: dr. Simon Vavpotič
2018_265_55
So hekerji že uganili vaše računalniško geslo? Se učite zapletena računalniška gesla na pamet? Jih pogosto pozabite? Rešitev je strojni upravljalnik gesel na osnovi PIC32.
Razvoj strojne opreme
Strojni upravljalnik gesel omogoča pomnjenje prijavnih gesel, varni vnos novih gesel preko PC, generiranje naključnih kompleksnih gesel, varno hrambo podatkov (funkcionalnost podatkovnega ključka), posnema tipkovnico in lahko samodejno vnese geslo v vaš računalnik.
V preteklem nadaljevanju smo izdelali električno vezje in osnovno programsko aplikacijo, ki je omogočala ročno ustvarjanje in varno hrambo seznama gesel ter samodejno tipkanje gesel v osebni računalnik. Tokrat bomo dodali tipkovnici upravljalnika gesel tri nova mikrostikala, s katerimi se bomo lažje premikali preko menijev. Dodali bomo še kodo pin, kriptografijo in ustvarjanje močnih naključnih gesel, omogočili bomo tudi neposredni ročni vnos gesla preko tipkovnice upravljalnika gesel. Pri razvoju programske opreme si bomo izdatno pomagali s programsko knjižnico Microchip Harmony 2.05 in razvojnim okoljem MPLAB X 4.05. Ukvarjali se bomo tudi z algoritmi za kodiranje podatkov in samodejno generiranje močnih naključnih gesel. V aplikacijo na PIC32 bomo dodali vnos varnostne kode pin ob priklopu upravljalnika gesel na osebni računalnik. Nekoliko bomo razširili tudi aplikacijo v PIC32, da bo podpirala dodatne opcije.
Ta vsebina je samo za naročnike
Microchip Harmony in varnostna kodiranja
Varna hramba podatkov v mikrokontrolerju mora vključevati kriptografsko zaščito, ki preprečuje neavtoriziran dostop po shranjenih gesel. K sreči ima programski okvir Microchip Harmony vgrajeno tudi kriptografsko knjižnico, ki jo lahko vključimo v svoj projekt s pomočjo Harmony Configuratorja. Izbiramo lahko med več naprednimi algoritmi za izračun kontrolne kode podatkov (angl. hash code): MD5, SHA-1, … SHA-512 in HMAC, algoritmom za izračun kode za odpravo napak (ECC) ter šifrirnimi in dešifrirnimi algoritmi DES, 3DES, RSA in AES. Medtem, ko prvi trije omogočajo asimetrično kriptografijo na osnovi javnega in privatnega ključa, uporablja AES enak ključ za šifriranje kot za dešifriranje.
Kriptografska knjižnica ima močno podporo za ustvarjenje naključnih števil, ki predstavlja osnovo za delovanje kriptografskih algoritmov. Seme za naključni generator lahko pridobimo iz konstantnega zapisa, veliko bolje pa je če uporabimo uro realnega časa, ali mikrokontrolerjev števec impulzov procesorskega takta. Algoritme iz kriptografske knjižnice lahko tudi kombiniramo in izdelamo lastni kriptografski algoritem, ki podatke veliko bolje zaščiti, kot vnaprej znani kriptografski algoritmi.
Ko se prvič srečujemo z uporabo kriptografije se splača natančno pregledati tudi primer encrypt_decrypt, ki ga najdemo v podimeniku appscrypto imenika, v katerega smo namestili programski okvir Harmony. V njem najdemo primere klicev vseh bistvenih funkcij kriptografske programske knjižnice. Hkrati lahko z njim preverimo pravilnost delovanja šifrirnih in dešifrirnih metod, saj primere vsebin najprej šifrira in nato primerja z vnaprej znanim pričakovanim rezultatom, ali pa vsebine šifrira in nato dešifrira, pri čemer pričakuje enak rezultat. Pri testiranju lastnih kriptografskih metod se moramo nekoliko bolj potruditi, saj šifrirane vsebine ne poznamo vnaprej, lahko pa preverimo, če jo znamo z ustreznim digitalnim ključem odšifrirati nazaj v prvotno obliko.
V kriptografski knjižnici je na voljo tudi kakovosten generator naključnih števil, ki ga uporabljamo pri tvorbi močnih naključnih gesel. Pri tem smo mu dodali še lasten algoritem, ki naključna števila še nekoliko preoblikuje, tako da ni mogoče vnaprej poznati naslednje vrednosti psevdo naključnega generatorja, tudi če bi natančno poznali delovanje naključnega generatorja iz kriptografke knjižnice v sklopu Harmony.
Kakorkoli, v lastni aplikaciji sorazmerno enostavno uporabimo kriptografske metode, saj je v prej omenjenem v zgledu, encrypt_decript, na voljo primer skoraj za vsak funkcijski klic, s katerim bodisi šifriramo, ali dešifriramo podatke iz izvornega podatkovnega polja in šifrirano ali dešifrirano vsebino shranimo v novo podatkovno polje. Datoteka z gesli je sorazmerno kratka. Zato je pomnilnika skoraj vselej dovolj; vsekakor pa lahko šifriranje/dešifriranje daljših datotek izvedemo tudi v dveh ali več kosih. Povejmo še, da smo pri preizkušanju kriptografskih metod lahko pri izbiri algoritmov v Harmony Configuratorju nekoliko bolj radodarni, za produkcijsko aplikacijo pa je smiselno odkljukati natančno tisto, kar potrebujemo, saj tako prihranimo dragoceni pomnilnik.
Dopolnjeni električna shema in aplikacija
Električno shemo smo razširili tako, da smo izkoristili še preostale tri vhode PIC32MX250F128B oz. PIC32MX270F256B in naje vezali tri dodatna mikrostikala (tipke). Tako se zdaj lahko preko menijev pomikamo ne le gor (up) in dol (down), temveč tudi levo (left) in desno (right), oziroma v globino in nazaj. Dodali smo tudi tipko prekliči (cancel) in z njo dodatno pohitrili in olajšali brskanje po menijih. Za uporabo novih tipk smo morali razširiti tudi sistem menijev, hkrati pa smo omogočili hierarhično urejanje opisov gesel in tvorjenje seznamov gesel, ki so lahko zaklenjeni s posebnimi kodami pin. Dodali smo tudi možnost ročne tvorbe ali dopolnitve močnega gesla na samem upravljalniku gesel, tako, da iz seznama znakov izberemo želeni znak in ga vstavimo v geslo. Ta način uporabe upravljalnika gesel je smiseln skupaj z aplikacijo za urejanje gesel na PC, saj slednja geslo shrani v datoteko neposredno na pogonu za masovno hrambo podatkov, ki je na upravljalniku gesel. Seveda moramo pred tem pogon odkleniti za dostop s strani PC.
Izboljšani upravljalnik gesel ima tudi različico z brezžičnim modulom za radijsko komunikacijo, ki omogoča izvedbo tihega alarma v primeru vtipkanja napačne kode pin ali kombinacije tipk. Preko brezžičnega modula odda obvestilo o napačni prijavi uporabnika in pošilja njegove poskuse uporabe različnih gesel varnostnemu sistemu. Vsekakor ima varnostni sistem določeno toleranco, saj se lahko uporabnik zmoti.
Za nove menije smo uporabili obstoječe programsko ogrodje, ki smo ga zasnovali v funkciji SPI1PrintMenu_OLED(char *s,int active,BYTE pg). Najprej smo v ustrezne tabele dodali le še dodatne opise za nove menije, ki so potrebni za razširitev funkcionalnosti aplikacije. Prav tako smo podporo za nove funkcionalnosti vnesli v programsko kodo, saj smo razširili odločitveno drevo z novimi funkcionalnostmi, s katerimi smo omogočili lažje in varnejše delo in obenem izboljšali uporabniško izkušnjo. Intuitiven grafični aplikacijski vmesnik upravljalnika gesel je zelo pomemben, saj ga upravlja s tipkovnico z le šestimi tipkami. Če bi dodali več tipk, bi potrebovali precej večjo napravo, hkrati pa v s tem ne bi dosti pridobili, saj je naprava primarno namenjena hrambi seznamov in podseznamov gesel.
Vsak dodaten meni ima tudi svojo programsko kodo, ki dobro izkorišča možnosti 32-bitnega mikrokontrolerja. Ker je izvorne programske kode preveč, da bi jo lahko natančno pregledali v tem članku, je na voljo na spletni strani https://sites.google.com/site/pcusbprojects. Poglejmo nekaj kratkih primerov iz programske kode: Datoteko iz pogona za masovno hrambo podatkov beremo takole: res = f_open(&fsrc, “FILE.TXT”, FA_OPEN_EXISTING | FA_READ) in res = f_read(&fsrc, buffer, sizeof(buffer), &br); medtem, ko z zaporedjem preprostih ukazov: NVMKEY=0xAA996655; NVMKEY=0x556699AA; NVMCONSET=NVMCON_WR; odklenemo krmilnik EEPROMa v PIC32 za pisanje, kar je potrebno pri spreminjanju prednastavljenih nastavitev aplikacije, ki so shranjene v EEPROMu. Pri izpisu števil si pomagamo z ukazom SPI1WriteDouble(activePW+1,1000,1), s katerim lahko izpišemo tako cela števila kot realna števila z decimalnimi mesti. Morda omenimo še primere, kako dodamo prazno polje: SPI1WriteChar5x8_OLED(‘ ‘), kako izbrišemo vrstico na zaslonu OLED: SPI1DeleteLine_OLED(4,1) in kako iz pomnilnika izpišemo opis gesla na zaslon OLED: SPI1Print_buffer_OLED(buffer,bufferPWdesc_start_pos[activePW],bufferPWdesc_end_pos[activePW],4,1). V nekaterih primerih je potrebno za pravilno delovanje upravljalnika gesel mikrokontroler resetirati, kar naredimo z ukazom: uC_reset().
Posnemanje tipkanja več tipkovnic
Skeletna programska koda za tipkovnico USB, ki smo jo omenili v preteklem nadaljevanju, podpira delovanje ene tipke, s pritiskom katere lahko po vrsti izpišemo vse črke abecede. Naša aplikacija zahteva precej več. Znati mora izpisati poljuben znakovni niz, tako da posnema delovanje tipkovnice. Čeprav se zdi enostavno, ni čisto tako. Tipkovnica USB ima za vsako fizično tipko določeno svojo skenirno kodo. A znaki iz nabora ASCII niso isto kakor tipke. Nekatere znake dosežemo zgolj s kombinacijo kontrolne in navadne tipke. S kontrolno tipko (npr. Shift) izberemo raven tipkovnice, nato pa s pritiskom navadne tipke še konkretni znak na tej ravni.
Dodajanje tabel skenirnih kod za posamezne vrste tipkovnic je lahko kar zamudno, še bolj zamudno pa je testiranje, saj moramo preveriti pravilnost izpisa prav vseh dovoljenih znakov. V Internetu najdemo tabele skenirnih kod samo za nekatere tipkovnice, za druge pa jih moramo na osnovi obstoječih tabel izdelati sami, tako da preberemo manjkajoče skenirne kode ali tiste skrenirne kode, ki se razlikujejo kar iz same tipkovnice. Pri tem si lahko pomagamo tudi z različnimi s programskimi orodji, ki so na voljo v spletu.
Bistveno pri posnemanju katerekoli tipkovnice je, da pravilno zajamemo vse kombinacije kontrolnih tipk in navadnih tipk, tako, da se geslo izpiše na ciljni računalnik enako, kot bi se, če bi ga ročno natipkali s pomočjo tipkovnice v izbranem naravnem jeziku.
Delovanje aplikacije
Zdaj, ko smo spoznali njene funkcionalnosti, je prav da povemo še nekaj o delovanju aplikacije, ki omogoča delovanje upravljalnika gesel. Aplikacija posnema delovanje večnitnosti, tako da lahko na videz izvaja več aktivnosti hkrati. Med glavne aktivnosti sodijo: podpora delovanju tipkovnice preko USB, podpora delovanju pogona za masovno hrambo podatkov, podpora za skeniranje pritisnjenih mikrostikal tipkovnice upravljalnika gesel ter podpora za izvajanje internih aktivnosti, ki jih uporabnik izbere preko ustreznih menijev. Ena izmed aktivnosti je tudi pomikanje preko drevesa menijev, ki je kar kompleksna, saj mora omogočati ne le premikanje po hierarhiji navzgor in navzdol, temveč tudi izbiro posameznih elementov. Uporabnik trenutno izbrani element vidi pod trenutno izbrano vrstico, katere vsebina je slikovno invertirana (črne črke na turkizno modri podlagi). Izbiro elementa izvede s pritiskom na tipko OK na tipkovnici urejevalnika gesel. Mimogrede omenimo še to, da je mogoče pomen posameznih tipk (oz. mikrostikal) prilagoditi v nastavitvah. Tako je v aplikacijo za PIC32 vgrajen faktor presenečenja, ki nepovabljenemu hekerju preprečuje dostop do podatkov tudi, četudi se dokoplje do naprave in pozna način njenega delovanja.
Posebno poglavje je tudi implementacija pomikanja po drevesu gesel, kjer imamo sproti tudi možnost ustvarjanja novih poddreves. Čeprav moramo pri tem upoštevati tudi zmogljivost pomnilnikov EEPROM in RAM, je 32 kB ali 64 kB RAMa ter 128 kB ali 256 kB EEPROMa vsekakor dovolj za hrambo dovolj dolgih gesel glede na največjo dolžino gesel, ki jo dopuščajo različni operacijski sistemi in spletni portali. Še posebej pri spletnih portalih moramo paziti, da ne tvorimo predolgih gesel, saj mnogi dovoljujejo le gesla dolžine do kakih 20 znakov. Pri operacijskih sistemih je z večine mogoče vnašati precej daljša gesla. Res pa je, da si tako dolgih gesel skoraj ne moremo zapomniti na pamet pa tudi, če bi si jih lahko, bi z njihovim vsakokratnim tipkanjem izgubljali preveč časa. Zato je potreben upravljalnik gesel, ki s posnemanjem tipkovnice geslo prenese v računalnik v manj kot sekundi.
Prav, je da pojasnimo še nekatere podrobnosti v zvezi z implementacijo aplikacije. Pri zajemanju stanj mikrostikal je zelo pomembna funkcija preprečevanje zaznavanje večkratnega pritiska na isto mikrostikalo. Programska koda ob zaznanju logične spremembe na vhodu mikrokontrolerja najprej počaka krajši čas (npr. 500 ms) in nato ponovno preveri stanje mikrostikala. Če je še vedno iste logične vrednosti, potem je tipka pritisnjena, oz. spuščena, če pa ne, spremembe ne upošteva, saj je lažna. Prav tako je grajena tudi zakasnitev ponavljanja, če je dlje časa pritisnjena ista tipka, podobno kot deluje tipkovnica na PC.
Vnos pina smo zaščitili tako, da mora uporabnik pred vnosom kode pin pritisniti posebno kombinacijo šestih tipk. Če tega ne naredi, tvega da bo izgubil vsa gesla. Strojni upravljalnik gesel ga namreč le nekajkrat opozori, da je prišlo do napake (koda napake je naključna), vendar mu namerno ne ponudi okna za vnos gesla. Tako je v napravo vnesen tudi dodaten faktor presenečenja, ki preprečuje njeno zlorabo. Število napačnih vnosov kode pin in kodo pin nastavi uporabnik preko posebnega nastavitvenega menija, potem, ko je upravljalnik gesel že odklenil s kodo pin.
V nastavitvah lahko izberemo tudi možnost, da ob vnosu napačne kode pina ali kombinacije tipk naprava namesto tega izpisuje napačna gesla in je videti kot, da sicer deluje pravilno. Ta oblika zaščite bo odvrnila še tako vztrajnega hekerja, saj bo mislil, da ima v rokah napačni upravljalnik gesel, ali pa da ta nima posodobljene zbirke gesel. Pri tem lahko skrivoma omejimo tudi število na videz uspešnih prijav z napačno kombinacijo tipk ali kodo pin. Če je slednje preseženo, se zbirka pravilnih gesel izbriše iz EEPROMa naprave. Heker tega ne more zaznati in bo še naprej poskušal udreti v računalniški sistem z napačnimi gesli. Podobne zaščite so sicer vgrajene tudi v določeno programsko opremo, ki mora zagotavljati visoko stopnjo varnosti, lahko pa jih s posebnimi dodatnimi programskimi paketi namestimo tudi v nekatere operacijske sisteme.
Dodatno zaščito nudi možnost hrambe izjemno pomembnih gesel v RAM; vendar le če napravo priključimo preko akumulatorsko podprtega pomnilnika, ki se obenem polni iz priključka USB. Med nedelovanjem računalnika, ali ko je naprava odklopljena od USB, se tako upravljalnik gesel napaja iz akumulatorske baterije. Če baterijo odklopimo, ali mikrokontroler resetiramo, so gesla izgubljena. Tako ni mogoče, da bi nekdo gesla prebral neposredno iz pomnilnika upravljalnika gesel, saj programator vselej resetira mikrokontroler.
Prav je, da omenimo še vodenje dnevnika prijav v upravljalnik gesel. V dnevnik se beležijo kode pin in kombinacije tipk, ki jih je uporabnik uporabil za prijavo ter ura in datum. Če je izbral napačno kodo pin ali kombinacijo tipk, se beležijo tudi vsi poskusi uporabe shranjenih gesel glede na opise gesel.
Podobne beležke je mogoče uporabljati tudi na ravni operacijskih sistemov. Prav tako je mogoče vgraditi lažna prijavna okna za dostop do funkcionalnosti namizja, v katerih odtipkamo geslo, ki je ustrezno samo, če je v sistem prijavljen ustrezen uporabnik.
Beležka se shranjuje v šifrirano datoteko, zato je ni mogoče prebrati brez dešifrirnega ključa, vendar pa upravljalnik gesel obenem tvori še navidezno beležko, ki daje vtis pravilnega delovanja, saj beleži le čase priklopa naprave na USB.
Procesorska ura, čas in datum
Pomemben del upravljalnika gesel je tudi ura realnega časa. Deluje neodvisno od PC in je baterijsko podprta skupaj s celotnim upravljalnikom gesel. Opcijsko lahko v nastavitvah izberemo tudi možnost, da se ura vsakokrat uskladi z uro iz PC, kadar upravljalnik gesel uporabljamo brez baterijske podpore. Sicer uro realnega časa aplikacija PIC32 uporablja pri tvorbi novih datotek, denimo datoteke z naključnimi gesli pa tudi kot seme za pri uporabi generatorja naključnih števil. Mimogrede omenimo, da lahko za seme generatorja naključnih števil v nastavitvah izberemo tudi sistemsko uro, ki teče glede na število ciklov sistemske ure. Ker generiranje novih gesel izvedemo ročno, tudi ni mogoče vnaprej vedeti, koliko bo vrednost procesorske ure, ko bomo pritisnili tipko za ustvarjanje močnega gesla. Zato tudi ob poznavanju delovanja psevdo naključnega generatorja ne moremo predvideti naslednjega naključnega števila.
Drugi varnostni ukrepi
Poleg varnostni kodiranj smo dodali tudi druge varnostne ukrepe, kot je vnos kode pin ob zagonu upravljalnika gesel. Kodo pin vnesemo preko posebnega menija, v katerem nam upravljalnik gesel ponudi izbiro cifer od 0 do 9. Vsakokrat ko z izbirnimi tipkami izberemo želeno vrednost, se na ekranu pojavi pikica, ki ponazarja vneseno cifro. Na ta način je potrebno vnesti štiri cifre. Kodo pin si moramo dobro zapomniti, saj je največje število napačnih vnosov omejeno. Če ga presežemo, upravljalnik gesel samodejno izbriše EEPROM, v katerem je shranjena šifrirana datoteka z gesli, obenem se mikrokontroler tudi resetira in tako pobriše tudi morebitna gesla, shranjena v RAMu. V tem pogledu je vsekakor dobro imeti tudi kopijo te datoteke na varnem računalniku, saj bomo sicer ob vsa shranjena gesla.
Z algoritmom za vnos kode pin je zaščiteno tudi odklepanje pogona z datoteko z gesli. Obenem je vnos novih gesel mogoč samo preko posebne namenske aplikacije v PC, ki skrbi za šifriranje in dešifriranje datoteke z gesli. Slednja je tako v upravljalniku gesel vselej šifrirana. Še enkrat poudarimo, kako pomembno je, da gesla urejamo na varnem osebnem računalniku. Pri tem si lahko pomagamo tudi s tipkovnico upravljalnika gesel, ki je izdelana iz mikrostikal. Prednost mikrostikal je, da delujejo na principu električnega stika, kar pomeni, da ne oddajajo šibkega elektromagnetnega signala med tem, ko so pritisnjene. V članku Svet ultranizkih frekvenc; zaznavanje naravnih pojavov in še česa v SE263 smo namreč prebrali, da je mogoče pritiske na tipke kapacitivne tipkovnice zaznati z ne preveč oddaljenim dolgovalovnim radijskim sprejemnikom in ustrezno računalniško aplikacijo. Uporaba mikrostikal to onemogoča.
Po drugi strani omogoča nova aplikacija za PIC32 tudi ustvarjanje močnih naključnih gesel. Naključno geslo ustvari v posebni šifrirani datoteki PWD.TXT, od koder ga lahko prenesemo v zbirko gesel s pomočjo aplikacije za PC, pred tem pa ga opremimo še z imenom za prikaz v seznamu gesel.
Aplikacija za urejanje gesel na PC
Čeprav lahko upravljalnik gesel uporabljamo na poljubnem računalniku, s katerim lahko povežemo standardno tipkovnico s priključkom USB, želimo navadno datoteko z gesli kodirati. Prav to omogoča aplikacija za PC, ki je dejansko aplikacijski povezovalni modul. Čeprav gesla še vedno lahko urejamo v priljubljenem urejevalniku besedil, jih aplikacija za PC najprej odšifrira in nato pošlje želeni aplikaciji za urejanje, kar morda ni najboljša možnost, saj so gesla med urejanje nekodirana. Druga možnost je, da za urejanje gesel uporabimo kar možnost, ki jo daje aplikacija za PC. Pri tem so dešifirirani podatki uporabljeni izključno znotraj aplikacije. Uporabljeno je tudi skrivanje gesel, kar pomeni, da se le ta ne izpišejo v obliki besedila, ampak zgolj kot zvezdice. Le če želimo, lahko vsako geslo posamično odšifrirano prikažemo tudi na ekranu.
Kako začeti?
V prvem delu članka smo poznali osnovni zgradbo in delovanje upravljalnika gesel, tokrat pa smo predstavili še pomembne funkcije, ki zagotavljajo varno shranjevanje gesel, ustvarjanje naključnih gesel, varovanje pred nepooblaščeno uporabo ter podporo za posnemanje delovanja tipkovnic z različnim razporedom tipk.
Če vas je drugi del članka pritegnil in ste se odločili sestaviti upravljalnik gesel, ponovimo, da potrebujemo za začetek projekta mikrokontroler in nekaj osnovnih elektronskih komponent. Microchipove mikrokontrolerje ni težko naročiti preko spleta (npr. na http://www.microchipdirect.com ali http://www.farnell.com). Datoteki HEX z vgrajeno programsko kodo za mikrokontrolerje PIC32MX250F128B in PIC32MX270F256B najdemo na spletni strani https://sites.google.com/site/pcusbprojects. Poleg je tudi nekaj izvorne kode, s katero si lahko pomagamo, če želimo izdelati lasten projekt.