Szyfrowanie pliku (strona logowania) - przechowywanie hasła

Szyfrowanie pliku (strona logowania) - przechowywanie hasła
Pepe
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 505
0

Taka zagadka na wekend...
Mam sobie program, który operuje na danych przechowywanych w pliku w formacie INI (uwielbiam za prostotę).
Chciałbym w swoim programie zrobić proste logowanie, które umożliwi odczyt tego pliku (który ma być zaszyfrowany dla osób postronnych) i da dostęp do programu.

O ile samo szyfrowanie pliku jakimś algorytmem nie powinno być problemem, to zastanawiam się jak coś takiego zaprojektować. Jak to się robi "profesjonalnie".
Bo:

  1. Użytkownik uruchamia program i ustawia dane logowania (powiedzmy login i hasło)
  2. Generowany jest plik danych, który po zakończeniu działania programu jest szyfrowany (i odszyfrowywany po prawidłowym zalogowaniu się).

Rozumiem, że hasła do odszyfrowania pliku nie przechowuję nigdzie bezpośrednio tylko jego hash - który jest porównywany z tym co wpisze użytkownik na stronie logowania - tak?
Gdzie ten hash mam przechowywać? Skąd go pobrać, by móc porównać z tym co użytkownik wpisze przy logowaniu?

-Pawel

Ps: Korzystam z pliku INI jako formatu danych, bo to stary program i nie chce mi się go zmieniać na bazę danych, choćby sqlite.

PD
  • Rejestracja: dni
  • Ostatnio: dni
2

Możesz zapisywać hash hasła, ale nie musisz.
Ponieważ jak zaszyfrujesz hasłem A to nie uda Ci się odszyfrować za pomocą hasła B, a nawet gdyby to wyjście będzie pełne "śmieci" więc łatwo zweryfikujesz czy zawiera jakiś ciąg znaków, który powinien zawsze się w pliku znajdować.
A jeżeli już chcesz zapisywać hash hasła w pliku to warto wcześniej je "posolić".

Pepe
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 505
0

No, myślę że najlepszym rozwiązaniem jest utworzyć hash hasła (posolę a nawet pocukruję, zmieniając/dodając jakiś ciąg znaków znany tylko mnie) i "gdzieś go zapisać". Pytanie wciąż aktualne. Gdzie zapisać ten Hash. Można by w rejestrze, ale wtedy rozwiązanie nie będzie przenośne... Zastanawia jak to robią profesjonalne programy...
A może jednak rejestr i opcja eksportu hasła (hashu) do pliku (jeśli ktoś chciałby mieć rozwiązanie przenośne)?
-Pawel

CP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 70
0

Jak chcesz zabezpieczyć program, to część jego kodu musi być zaszyfrowana i dostęp uzyskać za pomocą klucza odszyfrować resztę.

Jak chcesz po prostu sprawdzić czy coś pochodzi od ciebie, to możesz asynchronicznie szyfrowanie wykorzystać podpis cyfrowy.

Nie ma czegoś takiego jak profesjonalnie się robi.
Żeby człowiek nie mógł odczytać to robisz jedno szyfrowanie, a te wewnątrz po odszyfrowaniu musi służyć żeby odszyfrować te drugie, czyli program.
Jak programu nie zaszyfrujesz to zawsze pójdzie zreversować i zmienić kierunek wykonania programu, tak teoretycznie nie pójdzie bo będzie wysoka entropia, czyli kompletnie losowe dane, bo takie generują porządne algorytmy szyfrowania, a je odszyfrujesz jak masz plik.

Też pewnie jak ktoś ten plik komuś wyśle i zreversują to uda im się odszyfrować co ważne w aplikacji.

Właściwie nie wiem co chcesz zrobić.
Możesz też taki klucz PBKDF2 generować z loginu i hasła/hasha, który będzie idealnie pasował do pliku, a ten plik wygenerować przy zalogowaniu przez twoją aplikację do serwera, serwer dynamicznie ten plik tak zaszyfruje, żeby pasował tylko do tego użytkownika z takim hasłem, jak zmieni dane to zmienią przeszyfrowujesz wszystkie pliki, tak żeby wszystko było spójne.

Ale zależy co chcesz osiągnąć, przechowywanie zaszyfrowanego pliku w tym samym miejscu co aplikacja nie jest najgorszym pomysłem, sam nie wiem, może jakby było wiadomo co za problem rozwiązujesz, jeśli jakieś aktualizacje to podpis cyfrowy jest idealny, możesz publiczny klucz zostawić a aplikacji, a prywatny masz u siebie i program jakichś losowych updatów nie zainstaluje u nikogo, dalej pójdzie zcrackować, ale jeśli jest bezpieczny system i aplikacja sama w sobie jest podpisana to można uniemożliwić jej uruchomienie żeby ochronić użytkownika jak jakikolwiek bit się zmieni.

PD
  • Rejestracja: dni
  • Ostatnio: dni
1

Hash hasła możesz zapisać razem w pliku z zaszyfrowaną treścią.
W załączniku masz prosty przykład napisany w Lazarusie - nie wymaga żadnych dodatkowych komponentów
Project1.zip

Pepe
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 505
0

@Paweł Dmitruk Zajrzałem w kod. O coś takiego mi chodzi. Zmienię jednak algorytm szyfrowania na coś a'la AES (z tego co wiem Blowfish jest raczej już nie stosowany). No i czeka mnie mnóstwo testów i napisanie samego logowania do aplikacji... ale to już czysta przyjemność. Zapis samego hasła w pliku rozwiązuje problem jego przechowywania - jak na moje amatorskie zastosowanie wystarczy w zupełności. Dziękuję.

Manna5
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 667
1
Pepe napisał(a):

Generowany jest plik danych, który po zakończeniu działania programu jest szyfrowany (i odszyfrowywany po prawidłowym zalogowaniu się).

Najlepiej by było w ogóle nie zapisywać odszyfrowanych danych na dysku, tylko trzymać je wyłącznie w pamięci operacyjnej, ale to już szczegół.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.