2010-05-06 16 views
8

Chcę zbudować prosty "login" logowania użytkownika w PHP, ale mam następujący dylemat: jak mam przechowywać nazwę użytkownika i hasło, jeśli nie jestem używając bazy danych?Najlepszy sposób na przechowywanie nazwy użytkownika i hasła bez bazy danych

Prosty plik tekstowy może być łatwo odczytany, a następnie hasło może być łatwo dekryptowane, więc nie jest to możliwe.

Jeśli utworzyć plik php z tylko

<?php 
    $Username= "username"; 
    $Password= "password"; 
?> 

wtedy nikt nie powinien być w stanie go odczytać i może po prostu zawierać tego pliku, gdzie jest ona potrzebna, ale nie jestem pewien, można” t znaleźć lepszy sposób na zrobienie tego!

Jakie jest, Twoim zdaniem, najlepsze rozwiązanie tego problemu (i dlaczego)?

Dzięki

Odpowiedz

3

Można przechowywać je w pliku i używają SHA1/SHA2 hash, w ten sposób, że nie można odszyfrować.

user:<sha1hash> 
user:<sha1hash> 
... 
+9

SHA2 (lub bcrypt), ** ** proszę! – SLaks

3

zwykły plik tekstowy jest opcja, i to najprostsze rozwiązanie tutaj. Po prostu hash hasło (z salt). Nie można go odszyfrować w wiarygodny sposób.

Do tego celu można użyć funkcji skrótu PHP md5 lub sha1.

+1

Istnieje kilka narzędzi, które próbują odszyfrować md5 i sha1, a przynajmniej w niektórych przypadkach wydają się działać (próbowałem ich raz). Nie sądzę, żeby sól była wtedy przydatna, wystarczy kilka prób. – Mokuchan

+0

Jeśli chcesz użyć silnego szyfrowania/hasha, to jest w porządku, ale płaski plik z zakodowanym hasłem jest zdecydowanie najłatwiejszym rozwiązaniem. –

+0

do cytowania SLaks: "użyj SHA2 (lub bcrypt), ** proszę! **" – Jacco

1
  • Można użyć pliku tekstowego z funkcją hash lub crypt. Jest niezawodny, ale niezbyt elastyczny, jeśli masz wielu użytkowników.

  • Można również użyć SQLite, która jest bazą danych, ale która nie jest serwerem i jest przechowywana w prostym pliku. To miły kompromis, jeśli nie możesz zainstalować serwera SQL, ale chcesz przechowywać wielu użytkowników i mieć większą elastyczność.

  • W zależności od tego, co chcesz zrobić, dobrym rozwiązaniem może być .htaccess. Jest już bezpieczny, ale jako rozwiązanie tekstowe nie jest elastyczny. Ale ma wbudowaną prawie całą konfigurację Apache.

2

Jeśli potrzebujesz wielu kont, zwykły plik tekstowy będzie łatwiejszy niż przy użyciu pliku źródłowego PHP. Myślę, że martwisz się tym, że ludzie żądają pliku za pośrednictwem przeglądarki?

Sprawdź, czy Twój usługodawca hostingowy ma jakiś katalog, który nie jest publicznie dostępny, na przykład katalog nadrzędny, w którym znajduje się rzeczywista treść internetowa. Zwykle PHP będzie mógł tam czytać i pisać, ale nie będzie dostępny przez Internet.

Uprawnienia do plików i/lub .htaccess files (Apache) mogą Ci pomóc, jeśli nie ma takiego katalogu, do którego masz dostęp.

Proponuję użyć funkcji crypt do przechowywania hasła (hash), zamiast zapisywania zwykłych haseł. To jest oddzielny problem, od którego je przechowujesz :)

+0

Myślałem o uprawnieniach do plików, ale nie wiedziałbym, jak je ustawić, aby działały: czy php jest uważany za "użytkownika", a żądania zewnętrzne za "inne"? – Mokuchan

+0

@Mokuchan: Zależy od konfiguracji serwera. Najprościej można się tego dowiedzieć sprawdzając dane wyjściowe 'phpinfo()' dla użytkownika/grupy. – Thorarin

1

Jaki jest cel posiadania nazwy użytkownika, jeśli jest tylko jeden użytkownik?

Równie dobrze można po prostu zarządzać uprawnieniami za pomocą .htaccess ...

+0

Umożliwia dostęp do funkcji administracyjnych, więc nawet jeśli jest tylko jeden administrator, nadal potrzebujesz hasła. Może nie potrzebujesz nazwy użytkownika, ale problem się nie zmieni. – Mokuchan

+0

@Mokuchan: Problem nie istnieje, jeśli tylko twój komputer ma dostęp do strony ... –

+0

Masz rację, ale jest to strona internetowa. – Mokuchan

1

(To zaczęło się jako komentarz do Daniela Dipaolo w odpowiedzi na Mokuchan.)

Jeśli chcesz przechowywać hasło (bez ważne miejsce), używasz następującego schematu:

$ hashedPassword = $ salt. hash ($ salt. $ password);

Miejsce przechowywania haszowanego hasła powinno być bezpieczne. Czy to w bazie danych, czy w pliku z odpowiednim zestawem uprawnień.

Jeżeli plik, twój „rekord” dla użytkownika bob z hasłem tajny będzie wyglądać mniej więcej tak (za pomocą BCrypt Hash):

bob:$2a$05$tlk4M8WSpVkO7ER6QGxcwuY91MrBCQn.TCDZ5eOM1iz2sCChtR62K 

Nie ma sposobu, aby ktokolwiek „odszyfrować ' hasło. Taki jest sens używania algorytmu Hashing: jest on nieodwracalny.

można stwierdzić, że:

Istnieje kilka narzędzi, które starają się odszyfrować MD5 i SHA1, a przynajmniej w niektórych przypadkach wydaje się działać

Jak mieszania algorytmy są nieodwracalne, To jest niemożliwe. (Nie ma opcji "odszyfrowania")

Moim najlepszym przypuszczeniem jest to, że odnosisz się do narzędzia, które wyszukało skrót z tabeli wstępnej, i zwróciło prawidłowy ciąg wejściowy, który prawdopodobnie będzie twoim hasłem.
Te tabele są nazywane rainbow tables. Mogą być pokonany przez A) za pomocą losowo sól i b) z zastosowaniem silnego algorytmu mieszającego (BCrypt mieszania lub mieszania SHA2 mieszkaniami dla przykładu)

Regarding niewłaściwych mieszania algorytmy: MD5 i SHA1 są uważane za kryptograficznie złamane. Innymi słowy: nie powinieneś już ich używać.

Do dyskusji na ten temat, patrz: https://stackoverflow.com/questions/2768248/is-md5-really-that-bad

0

Ditto do tych wszystkich, mówiąc, można zaszyfrować hasło.

Ponadto nie umieszczaj pliku w drzewie dokumentu. Umieść plik w innym miejscu. Twój program PHP powinien nadal być w stanie go odczytać, podając bezwzględną ścieżkę lub względną ścieżkę, która przechodzi "..", jednak wiele poziomów do pracy w hierarchii, a następnie do miejsca, w którym znajduje się plik. (W aplikacjach Java znajduje się katalog WEB-INF, który jest wygodny do przechowywania tego typu rzeczy.) Nie sądzę, żeby coś takiego było w PHP - minęło trochę czasu odkąd zrobiłem PHP-ale możesz zawsze po prostu umieść plik całkowicie poza hierarchią katalogu twojej aplikacji.)

0

Najlepszym sposobem na to jest

$ password_hash = hash ("sha256", "iamawesome"); // 4aa4029d0d0265c566c934de4f5e0a36496c59c54b6df8a72d9c52bdf0c1a0e8

$ user_entered = hash ("sha256", $ _POST [ 'password']); return ($ user_entered == $ password_from_db);

hashin zabezpieczy hasła ..

szczegółowy artykuł: http://wblinks.com/notes/storing-passwords-the-wrong-better-and-even-better-way

+0

Przeczytaj to jeszcze raz. Najlepszym sposobem na wykorzystanie tego artykułu jest "wykorzystanie dobrze sprawdzonej biblioteki, wypróbowanej i przetestowanej w terenie, i napisanej przez prawdziwych ekspertów ds. Bezpieczeństwa, dostępnych jest wiele opcji, a bcrypt i scrypt to popularne opcje". –