Moje zdjęcie
Uczeń LO im. Ma­­ła­chow­skie­go w Płoc­ku. Lubi czy­tać książ­ki. Ma du­żo po­my­słów, jed­nak za­zwy­czaj ma­ło chę­ci lub nie­do­bór umie­jęt­no­ści na ich re­ali­za­cję. In­te­re­su­je się pro­gra­mo­wa­niem. Bie­rze udział w kon­kur­sie po to aby na­uczyć się cze­goś no­we­go. Ocze­ku­je na kon­struk­tyw­ną kry­ty­kę.

niedziela, 26 września 2010

107: Sprawdzanie poprawności hasła

Kolejny tydzień się kończy, a baza danych nadal nie napisana. Dlaczego znowu? System autoryzacji użytkownika napisany na Linuksie nie chciał działać na Windowsie i trzeba było przepisać go od nowa. Ale teraz działa i chciałbym opisać teraz w jaki sposób.

Zacząć należy od tego, że hasło jest siłą systemu szyfrowania jaki chcę zaimplementować. Na jego podstawie losowany jest kod, który służy do szyfrowania i odszyfrowywania.

Można by pomyśleć, że skoro bez hasła i tak nie uda się poprawnie rozszyfrować pliku, to po co w ogóle sprawdzać poprawność podanej kombinacji?

Powód jest bardzo prozaiczny: każdemu zdarza się pomylić, a próba odkodowania pamiętnika przy użyciu błędnego kodu może mieć różne skutki, przy czym program na pewno się zawiesi, a zatem nie będzie możliwa ponowna próba wpisania hasła. Trzeba je więc sprawdzić i poinformować użytkownika o ewentualnej pomyłce.

Zacznijmy od tego jak działa szyfr. Otóż opiera się on na metodzie int db:Base::getCode(int ch), która zwraca wartość przesunięcia dla znaku o indeksie ch. W przypadku szyfrowania właściwego pliku dodane zostaną także metody char db:Base::Code(char c) i char db::Base::deCode(char c), zwracające wartość przesuniętej już litery, póki co nie było to jednak konieczne, gdyż używane dotychczas znaki mieszą się w spójnym przedziale.

Następnie system autoryzacji, którego fragmenty znajdują się w zalążkach funkcji zapisującej (int db::Base::Save(string filename)) i odczytującej (int db::Base::Load(string filename)) pamiętnik z pliku. Pierwsza z nich generuje 479 losowych bajtów o wartościach z przedziału od 33 do 126 (poza tym przedziałem znajdują się znaki, które uniemożliwiają odczyt pliku na Windowsie - na Linuksie działało), kodując je na bieżąco poprawnym hasłem. Do zakodowanej wersji dodaje 0 oraz sumę MD5 wersji odkodowanej. Tak wygenerowany łańcuch zapisywany jest do pliku.

Funkcja ładująca natomiast pobiera pierwsze 479 bajtów i odkodowuje je podanym hasłem, pomija bajt "0" i wczytuje pozostałe bajty - sumę pierwszych bajtów odkodowanych poprawnym hasłem. Na końcu porównuje ją z sumą odkodowanych na początku bajtów. Jeżeli są różne - hasła się na pewno nie zgadzają (zwracane jest -1). Jeżeli są równe, to najprawdopodobniej hasło jest poprawne i odczytywanie pamiętnika jest kontynuowane.

W ten prosty sposób można sprawdzać poprawność hasła nie zapisując go w żadnej postaci w pliku pamiętnika.

PS: Obecna wersja Logtree działa w pętli umożliwiającej zapisywanie i odczytywanie plików z podanymi hasłami. Nie ma dostępu do edycji postów. Aby zapisać testowy plik należy użyć komendy save plik haslo, gdzie plik jest nazwą pliku bez rozszerzenia. Podobnie wczytujemy pliki przy pomocy load plik haslo. Krzaki wyrzucane na ekran to odkodowane 479 bajtów i ich suma kontrolna. Program można zamknąć przy pomocy quit.

Brak komentarzy:

Prześlij komentarz