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