0195b - Hasło inaczej

Powracając do nieśmiertelnego tematu zabezpieczeń programu przed dostępem osób niepowołanych, chciałbym zaprezentować swój dość oryginalny sposób. Do uwierzytelniania wszelkich dokumentów bardzo dobry jest "wyrobiony", czyli powtarzalny i mający swoje cechy chrakterystyczne podpis.

Zastosowanie własnego podpisu w roli hasła wejściowego do sieci komputerowej czy programu napotyka jednak na poważną barierę: brak taniego i łatwo dostępnego urządzenia wejściowego kodującego bezpośrednio (bez dodatkowych nośników w postaci np. kartki papieru) pisany tekst. Można jednak pokusić się o stworzenie rozwiązania, które zawiera wyżej wymienione atrybuty podpisu, tj. powtarzalność i trudne do podrobienia cechy charakterystyczne, i współpracuje z klawiaturą komputerową.

Analiza statystyczna wprowadzania dłuższych tekstów na komputerze wykazuje, iż czasy między naciskaniem liter powtarzających się często wyrazów są indywidualną cechą operatora, a ich wartości: od 50 do 500ms utrudniają ich podrobienie.

Procedura podaj_haslo zlicza przerwania czasowe 1ch między naciśnięciem klawiszy, czyli mierzy czas między nimi z dokładnością do 55 ms. W programie podane są czasy uzyskane przez autora w przypadku hasła cyfrowego "5148132". Przyjęta tolerancja przy weryfikacji czasów (0,11 s) wydaje się być najwłaściwsza (prawdopodobieństwo dobrego wstukania hasła wynosi około 0,9). Aby zmienić hasło na inne, należy jeszcze zdyskretyzować i uśrednić wyniki dla około 25 prób, co wymaga niewielkiej przeróbki procedury (powinna ona wypisywać wartości tablicy "czasy" na urządzenie wyjściowe), co zainteresowanym czytelnikom nie powinno sprawić trudności.

Powyższy pomysł został praktycznie sprawdzony na grupie kilkunastu studentów i, mimo iż każdy z nich znał haslo, żadnemu z nich - nawet przy wielokrotnych próbach - nie udało się go złamać.

 uses crt,dos;

 var licznik:word;

 {$F+}
 procedure przerwanie_czasowe;interrupt;
 begin
   inc(licznik)
 end;
 {$F-}

 function podaj_haslo:boolean;
 var i,krotnosc : byte;
 znak : char;
 haslo : string[8];
 punkt : pointer;
 ok : boolean;
 czasy : array[1..8] of word;
 begin
   Checkbreak := false;
   krotnosc := 0;
   getintvec($1c,punkt);
   setintvec($1c,ˆprzerwanie_czasowe);
   ok := false;
   repeat
     write(#13,'':21,#13,'PODAJ HASLO: ');
     i := 0;
     haslo := '';
     licznik := 0;
     repeat
       znak := readkey;
       inc(i);
       if znak = #0 then
       begin
         znak := readkey;
         znak := #0;
         i := i-1
       end else 
       begin 
         if znak#13 then czasy[i] := licznik; 
         licznik := 0; 
         write('*'); 
         haslo := haslo + znak
       end;
     until (znak = #13) or (i = 8); 
     if haslo = '5148132' + #13 then             {WLASCIWE HASLO}
     if (czasy[2] = 3) or (czasy[2] = 2) then    {POROWNANIE CZASOW} 
     if (czasy[3] = 3) or (czasy[3] = 4) then 
     if (czasy[4] = 3) or (czasy[4] = 2) then 
     if (czasy[5] = 3) or (czasy[5] = 4) then 
     if (czasy[6] = 3) or (czasy[6] = 4) then 
     if (czasy[7] = 1) or (czasy[7] = 2) then ok:=true;
     inc(krotnosc);
     if not(ok) then write(#7);
   until ok or (krotnosc=4);
   setintvec($1c, punkt);
   Checkbreak := true;
   podaj_haslo := ok;
 end; 

 begin
   clrscr;
   if podaj_haslo then 
   begin 
     write('    DOBRZE');  {URUCHOMIENIE WLASCIWEGO PROGRAMU} 
     {...} 
   end else 
   begin 
     write('    ZLE');        {REAKCJA NA ZLE WCZYTANE HASLO} 
     {...} 
   end; 
 end.

Jacek Biskupski 
PC Kurier, Styczeń 1994r