2010-10-14 15 views
7

Potrzebuję "zabezpieczyć hasłem" mojej aplikacji, ale potrzebuję porady, gdzie bezpiecznie przechowywać hasło.Bezpieczne przechowywanie hasła

Jak mam zamiar to zrobić:

Za pierwszym razem program jest uruchamiany, będę poprosi użytkownika o utworzenie hasła. Hasło zostanie zasolone i zaszyfrowane w SHA-256, a następnie zapisane w Rejestrze lub pliku.

Problem:

Gdybym przechowywać hasła hashed w rejestrze lub pliku (lub oba) to byłoby zbyt łatwe dla kogoś, kto po prostu usunąć klucz rejestru lub plik i zostać poproszony o utwórz nowe hasło ...

Jak mogę bezpiecznie przechowywać zaszyfrowane hasło, aby utrudnić usuwanie?

Zastanawiałem się nad przechowywaniem go w Rejestrze, a także tworzeniem pliku z atrybutami Ukryte i systemowe do odczytu w przypadku usunięcia pliku rejestru, ale wydaje się to niemądre, ponieważ można go usunąć całkiem łatwo.

// Mam nadzieję, że poprawnie zaksięgowałem to pytanie za pomocą odpowiednich tagów - jestem tu nowy, więc proszę, idź łatwo! ;)

Wszystkie najlepsze

Chris (Shamballa)

+0

Kogo/czym bronisz? – SLaks

+0

Dlaczego Twój użytkownik powinien podać hasło, a potem nigdy więcej? – codymanix

+0

SLaks ... Muszę upewnić się, że nikt nie może uzyskać dostępu do programu z wyjątkiem osoby, która utworzyła hasło. – Shambhala

Odpowiedz

15

Jest to po prostu kwestia programowania Etyki 101. Jeśli przechowujesz informacje na czyimś komputerze, pamiętaj, że komputer jest ich własnością i mają prawo do usuwania lub modyfikowania dowolnego pliku lub klucza rejestru. Próba uczynienia go tak, że nie może to bardzo zły pomysł.

Jest dobry powód, dla którego nie możesz tego zrobić. Co by się stało, gdyby ktoś zaczął umieszczać pliki, których nie możesz usunąć lub zmodyfikować na swoim komputerze? Z ekstrapolacji do logicznego wniosku: co by się stało, gdyby wirus zaczął umieszczać pliki, których nie można usunąć lub zmodyfikować na komputerze, i zrobił to w nieskończonej pętli, aż do zapełnienia twardego dysku? You wiem jeśli to było możliwe, ktoś by spróbował.

Jeśli chcesz program, który przechowuje hasło w miejscu, w którym użytkownik nie może go zmodyfikować, umieść go na serwerze i poproś program, aby skontaktował się z nim przez połączenie internetowe. (Jest to zupełnie inna puszka robaków, ale przynajmniej nie próbujesz robić rzeczy niemożliwych lub naruszasz podstawowe prawa własności użytkowników.)

+2

Przez Internet jest bardzo bezpieczny sposób, ale masz kłopot z zapewnieniem, że twoja usługa jest zawsze w stanie umożliwić im zalogowanie się, tak jak niektóre z usług gier tam. Umożliwiłoby to również zarządzanie twoją strukturą licencjonowania (jeśli taką posiadasz) na twoim serwerze, jeśli program działa tylko wtedy, gdy może połączyć się z twoją usługą. Ma to swoje wady, ponieważ tego nie robi. – jimplode

+0

Tak. Tak jak powiedziałem, przynosi to własną puszkę robaków. Ale przynajmniej teoretycznie jest to możliwe. To, czego PO chce po prostu nie jest. –

+0

Myślę, że kwestia etyczna tnie w obie strony. Tak długo, jak użytkownik może zmienić lub usunąć hasło _podczas dostarczania istniejących haseł_, nie sądzę, że odbierasz im prawa. Problem polega na tym, że użytkownik, który specjalnie pragnie zablokować swoją aplikację po utworzeniu hasła - jak to osiągnąć? –

3

Najlepszym rozwiązaniem byłoby poleganie na zewnętrznym źródle, które użytkownik NIE może kontrolować przechowywania części hasła. W przeciwnym razie, bez względu na to, gdzie to ukryjesz, może to być łatwo odkryte przez kogoś z kilkoma darmowymi narzędziami i trochę czasu.

Osobiście znalazłem najlepsze miejsce do przechowywania takich danych na otwartej przestrzeni, razem z innymi danymi, do których często ma dostęp aplikacja. Należy pamiętać, że jeśli użytkownik ma dostęp do modyfikacji danych, jest zagrożony.

Jeśli chcesz zablokować swój program, wymaga, aby klucz już istniał przed uruchomieniem programu. W ten sposób musisz się tylko martwić o to, jak zdobyć klucz, a ponieważ jest on zaszyfrowany, trudniej będzie mu stworzyć taki, który będzie działał dla twojego systemu.

Do początkowego procesu uwierzytelniania można umieścić część klucza na serwerze sieci Web, podać użytkownikowi hasło wymagane do utworzenia zaszyfrowanego pliku.Korzystanie z klucza dostępu prowadzi do klucza na serwerze, a jeśli jest on ważny, zezwól mu na zapisanie zaszyfrowanego pliku. Jeśli martwisz się ponowną aktywacją, to po jej aktywowaniu możesz usunąć plik na swoim serwerze WWW.

Inną opcją byłoby użycie czegoś takiego, jak OnGuard (latest versions), aby zakodować klucz ograniczony czasowo, który dajesz użytkownikowi. Następnie, gdy aktywacja zostanie uruchomiona, sprawdź, czy dostarczony klucz wygasł lub nie, a jeśli tak, nie zezwól na aktywację. W ten sposób klucz aktywacyjny jest zagrożony tylko przez ograniczony czas.

Nie spędzaj zbyt wiele czasu na ten temat. Nawet najlepszy algorytm można załatać za pomocą kilku instrukcji NOP po wdrożeniu aplikacji.

+1

To jest dobra opcja, zwolnij program za pomocą blokady klawiszy. więc wygenerowany klucz seryjny odblokuje program i pozwoli mu go używać i uruchamiać, a następnie pozwolić użytkownikom na podanie własnego hasła. To o wiele lepszy model niż próba podkreślenia, że ​​używają połączenia internetowego do weryfikacji licencji. Oto link do zestawu startowego shareware, który może dać ci kilka pomysłów. http://blogs.msdn.com/b/danielfe/archive/2005/07/10/437293.aspx – jimplode

+0

@jimplode - tak, że działa również, ale nie ogranicza użycia klucza, chyba że jest coś zewnętrznego do pracy przeciwko temu. – skamradt

+0

Yup ... licencjonowanie i ochrona seryjna jest tak trudnym biznesem !! Gdyby to było ja, nie zawracałbym sobie głowy celowaniem na profesjonalnym rynku, który mógłby zapłacić za używanie i nie nadużywać go. Zwłaszcza, że ​​wszyscy oni podlegają audytom, których naprawdę nie mogą oszukać. Sektor prywatny ... Powodzenia, jeśli znajdzie się w rękach ogółu społeczeństwa, zostanie złamany bez względu na to, co zrobisz. – jimplode

4

Możesz bezpiecznie zapisać hasło do aplikacji, używając Windows crypto API. Istnieje przykład jego użycia w CodeGuru, ale jest napisany w C++, a nie w Delphi. Kod nie jest zbyt trudny, więc należy go stosunkowo łatwo przekonwertować na Delphi.

Bardziej zaawansowanym rozwiązaniem byłoby zapytanie użytkownika o hasło przed pobraniem aplikacji i osadzenie zakodowanego hasła w pliku binarnym - oczywiście w przypadku wielu kopii aplikacji można łatwo określić lokalizację zaszyfrowana wartość i kod sprawdzający w celu jej usunięcia.

Problem polega na tym, że nie stworzyłeś żadnej wartości z użycia hasła, tj. Wydaje się, że jest to tylko hasło na jego podstawie. Powinieneś użyć hasła jako nasienia do zaszyfrowania danych aplikacji i powiązać hasło z danymi. Stracić hasło i tracisz tylko dane.

1

Jest co najmniej 2 sposoby na zinterpretowanie pytania.

(1) Chcesz przechowywać hasła, aby można było je później wykorzystać do logowania do zdalnej bazy danych.

This answer na stronie Password encryption in Delphi objaśnia część szyfrowania.

W ten sposób można zapisać hasło, aby później można było użyć do uwierzytelnienia użytkownika, logując się przy użyciu aplikacji na serwerze bazy danych lub czymś podobnym.

Część "nie usuwaj" jest bardzo wrażliwa dla użytkowników; Nie zrobiłbym tego.

(2) Chcesz zapisać hasło, aby można było użyć go do sprawdzenia, czy użytkownik ma lokalny dostęp do aplikacji.

Jest to trudniejsze, ponieważ zasadniczo nie można.

Najbliższy sposób to zachowanie działającego w tle procesu, który blokuje plik.
Użytkownik komunikuje się z tym procesem, aby odblokować plik, aby można było zweryfikować hasło.

--jeroen

+0

Przepraszam - Zwalnia numerację; Zrobiłem 1. i 2. –

+0

... dopóki użytkownik nie użyje Process Managera do wykrycia, kto trzyma blokadę, zabija proces i usuwa plik. ;) –

+1

Dlatego właśnie twórcy wirusów i trojanów wkładają tyle wysiłku w ukrywanie swoich rzeczy. I nie mogą. O ile nie zainstalują zestawu root, takiego jak Sony, dla ochrony przed kopiowaniem: http://en.wikipedia.org/wiki/Sony_BMG_CD_copy_protection_scandal –

0

Jeśli potrzebujesz jednego hasła, szyfrowania i przykleić go tylko na koniec .exe. Zrobiłem to z powodzeniem wiele razy.

+0

Jeśli użytkownik nie jest administratorem lub nie uruchamia podwyższonego exe, może nie mieć uprawnień do zapisu. – Remko

+0

To brzmi interesująco, do przechowywania hasła w programie? Czy nie byłoby to jednak sygnalizowane przez programy antywirusowe? – Shambhala

+0

Ups - Wpisany i został złożony, zanim skończyłem pisać! Zamierzałem dodać >> Jak to zrobiłeś? To powinno być dodane podczas pracy. – Shambhala

0

Proponuję użyć funkcji uwierzytelniania w systemie Windows, w szczególności CredWrite i CredRead.Byłoby również możliwe wykorzystanie okna szyfrowania daje (CryptProtectData/CryptProtectMemory), a następnie zapisać poświadczenia

EDIT: Jeśli zajdzie potrzeba nagłówki dla Delphi, są one dostępne w Jedi Windows Api Library.

5

Nie sprecyzowałeś, co chroni to hasło. Zakładam, że jest używany do ochrony danych tworzonych przez twój program.

Nie jestem ekspertem od zabezpieczeń ani kryptografem, ale jeśli dane są przechowywane lokalnie, rozwiązanie jest proste. Przechowuj zarówno hasło (lub bardziej prawdopodobny hash hasła), jak i dane w tym samym miejscu (plik, DB itp.), Zaszyfrowane oddzielnymi kluczami.

Zapobiega to obejściu poprzez usunięcie pliku. Skasowaliby również wszystkie dane. To pokrzyżuje wszystkich oprócz najbardziej zdeterminowanego użytkownika końcowego.

+0

Chciałem o tym wspomnieć. Użyj hasła jako klucza szyfrowania. W ten sposób ich dane są naprawdę bezpieczne i nie ma sensu usuwanie hasła. Jedynym problemem jest to, że wielu ludzi nie chce ich zaszyfrować. Chcą mieć możliwość odzyskania swoich danych na wypadek, gdyby zapomnieli hasła, ale nie chcą, aby ich dane były łatwo dostępne po prostu przez otwarcie programu. Wiem, że nie możesz mieć swojego ciasta i jeść, ale tego chce wielu użytkowników. – Kibbee

+0

Hasło służy do ochrony dostępu do faktycznego programu. to znaczy. być w stanie uzyskać dostęp do programu po zainstalowaniu. Program, który rozwijam, to program do szyfrowania wiadomości e-mail. Używa AES Rijndael w 256-bitowym trybie CBS, więc to hasło jest wybierane tuż przed czasem szyfrowania, ale nigdy nie jest przechowywane. Inicjuję "klucz", którego używają z SHA-256, który staje się rzeczywistym kluczem. To nigdy nie jest przechowywane. W przeciwnym wypadku każdy mógł odszyfrować dane za pomocą jednego określonego wcześniej klucza ... – Shambhala

+0

Miałem na myśli tryb CBC ... – Shambhala

1

Sądząc z opisu, że nie rozumieją, że jeśli wszystkie zabezpieczenia masz jest

if not SameString(Hash(UserPassword), StoredPassword) then exit; 

Wtedy masz żadnego zabezpieczenia w ogóle, a nie jest to sprawa usunięcia pliku hasło użytkownika. Użytkownik może po prostu otworzyć plik exe w dowolnym edytorze binarnym i NOP na część, która nie do sprawdzenia:

//if not SameString(Hash(UserPassword), StoredPassword) then exit; 
//Check commented out ---malicious user 

trzeba zdać sobie sprawę, że nawet jeśli skompilować aplikację, to wciąż zawiera cały kod źródłowy, tuż monter. Nadal możesz edytować źródło, jest to trochę trudniejsze, ponieważ teraz jest w innym języku.

Dlatego, jeśli chcemy zapobiec użytkownikowi robić coś w swojej aplikacji, istnieją tylko dwa sposoby:

  1. Write-Protect swoją aplikację i to pliki. Lub przechowuj je na osobnym serwerze, jeśli nie masz nad nim kontroli. Lub po prostu uczyń z nich usługę, która akceptuje tylko stały zestaw poleceń.

  2. Ustaw, aby aplikacja nie sprawdzała, ale szyfruje coś krytycznego za pomocą hasła. Oczywiście, złośliwy użytkownik może zresetować hasło lub nawet całkowicie usunąć procedurę deszyfrowania, ale nadal będzie musiał odszyfrować dane.

Można obejść każde inne rozwiązanie, a to wszystko zależy od czasu i umiejętności potrzebnych do obejścia. Na przykład, możesz zaszyfrować kluczową część kodu aplikacji i odszyfrować go w locie (zrobił to raz). Następnie wykonaj i zaszyfruj z powrotem. Bez prawidłowego hasła Twoja aplikacja nigdy nie będzie działać.

Jednak złośliwy użytkownik może zainstalować oddzielną kopię aplikacji o znanym haśle, zbadać fragmenty programu po odszyfrowaniu i złożyć je w niezaszyfrowanym źródle. Pewnie, to dużo pracy. Ale można to zrobić w skończonym czasie.

Powiązane problemy