Prosty klucz autoryzujący na bazie płytki Digispark

Jako, że często muszę wpisywać hasło systemowe, czy hasło do odszyfrowania pliku keepass, a te do najtrudniejszych nie należą fajnie byłoby zrobić coś w rodzaju „przycisku”, który będzie robił to za mnie. Nie będę musiał wpisywać hasła ręcznie, a do tego te będzie znacznie silniejsze. Postanowiłem wykonać coś takiego na płytce Digispark bo jest tani, mały i prosty w obsłudze.

Digispark to niewielka płytka posiadająca na sobie mikrokontroler attiny85 (choć są nowsze wersje z innym attiny). Płytkę możemy znaleźć w kilku wariantach, najczęściej wybieranym jest jednak ten, który ma na sobie wtyk USB. Na attiny zainstalowany jest firmware – Micronucleus, który pozwala w bardzo łatwy sposób programować mikrokontroler bezpośrednio z portu USB. Bo właśnie, głównym przeznaczeniem tej płytki jest tworzenie prostych urządzeń HID opartych o programowe rozwiązanie USB. Instalowanie płytki w arduino IDE, oraz sterowników do obsługi vusb przedstawione jest na stronie producenta.

W banalny sposób, z pomocą dostarczanej przez producenta (Digistump) biblioteki „DigiKeyboard” można zaprogramować Digisparka jako klawiaturę i wysyłać z niego znaki, klawisze, ciągi znaków… Dzięki temu możemy zrobić prosty klucz autoryzujący (password key). Klucz ten będzie wysyłał ciąg znaków (hasło) po wciśnięciu przycisku.

Digispark keyboard

By zrobić z naszej płytki urządzenie imitujące klawiaturę wystarczy do projektu Arduino zaimportować bibliotekę „DigiKeyboard”. Poniżej zamieściłem kod całego programu.

#include "DigiKeyboard.h"
void setup() {
  pinMode(1,OUTPUT);
  DigiKeyboard.sendKeyStroke(0);
  digitalWrite(1, HIGH);
  delay(100);
  digitalWrite(1, LOW);
  pinMode(1,INPUT);
}


void loop() {
 if (digitalRead(1)){
  DigiKeyboard.print("@g3PP>Jx5ckWm]4;W98");
  while (digitalRead(1));
  delay(100);
 }
}

Jak nie trudno zauważyć, program będzie wysyłał hasło za pomocą funkcji DigiKeyboard.print(), za każdym razem gdy pojawi się stan wysoki na pinie 1. W funkcji setup, na samym początku skonfigurowałem ten pin jako wyjście by zasygnalizować mignięciem diody, gotowość do pracy.

Teraz wystarczy wgrać program i dolutować do płytki przycisk. Ja do jego zamocowania użyłem kleju „na gorąco”.

Digispark password key

Po kilku sekundach od podłączenia płytki do portu USB mignie dioda na pinie 1, co będzie oznaczać, że możemy już wysyłać nasze hasło.
Urządzenie w tryb HID keyboard przełącza się całkiem szybko, ale przed tym występuje 5-cio sekundowe opóźnienie. W trakcie tych 5 sekund mikrokontroler przechodzi w tryb programowania, i jeżeli nie zauważy nadchodzących danych, odpala program z pamięci. Może to być uciążliwe, zwłaszcza gdy po włączeniu komputera musimy czekać dodatkowe 5 sekund w ekranie logowania.

Podmiana firmware’u w Digispark

Opóźnienie można usunąć podmieniając firmware na jego inną wersję. Ten, który wgramy w stan programowania będzie przechodził tylko gdy pin 0, zwarty będzie do GND. Firmware pobrać można z tego linku, nazwa pliku to „micronucleus-1.11-entry-jumper-pb0-upgrade.hex„.

Nie będę pokazywał jak załadować nowy firmware do mikrokontrolera, jest to prosta operacja, dobrze przedstawiona na tym filmie. Po wgraniu firmware’u musisz jeszcze raz załadować program w arduino IDE.

Działanie klucza autoryzującego

Na powyższym filmie można zobaczyć klucz w akcji. Oczywiście, nie jest to w pełni bezpieczne bo hasło w nim bardzo łatwo podejrzeć, czy to robiąc mem dump procesora, czy po prostu wpisując je do notatnika. Rozwiązania komercyjne takie jak np. Yubikey odpowiednio szyfrują hasło, tak że jego wklejenie do notatnika niewiele nam da bez klucza deszyfrującego.
Na digisparku niestety czegoś takiego nie osiągniemy – za mało pamięci. Musielibyśmy użyć czegoś mocniejszczego np. atmegi32u4, która posiada 32Kb pamięci flash, oraz sprzętowy interfejs USB.

Do moich potrzeb taki poziom zabezpieczeń w zupełności wystarczy. By logować się do lokalnych usług będzie to rozwiązanie w sam raz.

2 komentarze

  1. wystarczy , że wpiszesz ręcznie kilka znaków i wtedy hasło będzie już trudniej podejrzeć.
    niby masz jakiś ciąg znaków ale nie wiesz, czy np nie dodasz losowych znaków na końcu kasując ostatni znak 😉

    P.S. Myślałeś o sieciach wifi na wypadek w? Cos co by działało gdy internet padnie? cc1101 i takie tam. jeśli by to połączyć z wifi mesh (esp-mesh lub nawet esp-now) zasięg mógłby być sporego osiedla. A sprzęt byłby tańszy niż router i wielokrotnie mniej prądu by pożerał

    1. Wybacz, że tak późno 🙄.
      Tak to prawda, jest to jakieś rozwiązanie by takie hasło uczynić nieco trudniejszym do wykradnięcia.

      Co do drugiego tematu, to jeśli dobrze rozumiem, chodzi Ci o utworzenie transmisji IP na bazie takich radiowych Transmiterów. Szczerze myślałem kiedyś by coś takiego sobie hobby’stycznie zrobić. Ale w głowie miałem raczej dwie karty sieciowe, które by się ze sobą komunikowały poprzez jakiś moduł radiowy. Pomysł z espkami i wifi jeszcze ciekawszy. Użyteczność pewnie zerowa, ale projekt fajny :). Dla mnie temat póki co odległy.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *