Jak najlepiej przechowywać informacje o użytkowniku oraz login i hasło użytkownika

Używam Mysql i zakładałem, że lepiej jest rozdzielić dane osobowe użytkowników i ich login i hasło na dwie różne tabele, a następnie po prostu odwołać je między nimi.

Uwaga: aby wyjaśnić mój post, Rozumiem techniki zabezpieczania hasła(hash, salt, etc). Wiem tylko, że jeśli stosuję praktyki z innych części mojego życia (inwestowanie, tworzenie kopii zapasowych danych, nawet pamięć osobistą), to w najgorszym przypadku (tabela lub fire), że dzielenie informacji między tabele daje możliwość ochrony dodatkowych danych.

Author: Tim, 2009-06-04

8 answers

Nie przechowuj haseł. Jeśli kiedykolwiek znajdzie się na dysku, może zostać skradziony. Zamiast tego przechowuj hasze haseł. Użyj odpowiedniego algorytmu hashującego , Jak bcrypt (który zawiera salt).

EDIT : OP odpowiedział, że rozumie powyższy problem.

Nie ma potrzeby przechowywania hasła w fizycznie innej tabeli niż login. Jeśli jedna tabela bazy danych jest zagrożona, dostęp do innej tabeli w tej samej bazie danych nie jest dużym skokiem.

Jeśli możesz rozważyć przechowywanie poświadczeń użytkownika w całkowicie oddzielnym magazynie danych od danych domeny. Jednym z najczęściej stosowanych sposobów jest przechowywanie poświadczeń na serwerze katalogowym LDAP. Może to również pomóc w każdej późniejszej pracy przy jednokrotnym logowaniu.

 37
Author: Michael Petrotta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-17 13:14:46

Hasła powinny być przechowywane jako hash kryptograficzny, który jest nieodwracalną operacją uniemożliwiającą odczytanie zwykłego tekstu. Podczas uwierzytelniania użytkowników wprowadzanie hasła jest poddawane temu samemu procesowi hashowania i porównywane.

Unikaj używania szybkiego i taniego hasha, takiego jak MD5 lub SHA1; celem jest uczynienie atakującego kosztownym obliczanie tabel tęczowych (na podstawie kolizji hash); szybki hash przeciwdziała temu. Użycie drogiego hasha nie jest problem w przypadku scenariuszy uwierzytelniania, ponieważ nie będzie to miało wpływu na pojedynczy przebieg skrótu.

Oprócz hashowania, sól hash z losowo wygenerowaną wartością; nonce, który jest następnie przechowywany w bazie danych i konkatenowany z danymi przed hashowaniem. Zwiększa to liczbę możliwych kombinacji, które muszą być generowane podczas obliczeń kolizji, a tym samym zwiększa ogólną złożoność czasową generowania tabel tęczowych.

Kolumna hash hasła może być stała długość; Twój hash kryptograficzny powinien wyprowadzać wartości, które mogą być zakodowane na stałą długość, która będzie taka sama dla wszystkich hashów.

W miarę możliwości unikaj włączania własnego mechanizmu uwierzytelniania hasłem; używaj istniejącego rozwiązania, takiego jak bcrypt.

Doskonałe wyjaśnienie, jak postępować z hasłami i czym należy się martwić, można znaleźć na stronie http://www.matasano.com/log/958/enough-with-the-rainbow-tables-what-you-need-to-know-about-secure-password-schemes.

Na koniec pamiętaj, że jeśli atakujący uzyska dostęp do twojej bazy danych, twoim bezpośrednim zmartwieniem powinny być wszelkie poufne lub identyfikujące go informacje, do których może mieć dostęp, oraz wszelkie szkody, jakie mógł wyrządzić.

 17
Author: Rob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-03 23:04:44

Nie ma nic złego w umieszczaniu ich w tym samym stole. W rzeczywistości byłoby znacznie szybciej, więc gorąco polecam. Nie wiem, dlaczego chcesz to rozdzielić.

 14
Author: Sasha Chedygov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-03 22:36:16

Spróbuję odpowiedzieć na twoje pierwotne pytanie. Posiadanie tego wszystkiego w jednej tabeli jest w porządku, chyba że masz po prostu dużo danych osobowych do zebrania. W takim przypadku może mieć sens rozdzielenie go. Decyzję tę należy podjąć w oparciu o ilość danych osobowych, z którymi masz do czynienia i jak często trzeba uzyskać do nich dostęp.

Powiedziałbym, że przez większość czasu robiłbym coś takiego w jednej tabeli:

UserID, FirstName, LastName, Email, Password, TempPassword
Ale... jeśli zbierasz o wiele więcej. Say you ' re zbieranie telefonu, faksu, daty urodzenia, biografii itp. A jeśli większość z tych informacji jest rzadko dostępna to prawdopodobnie umieścić to we własnej tabeli i połączyć je z relacji jeden-do-jednego. Po tym wszystkim, im mniej kolumn masz na stole, tym szybciej zapytań przeciwko tej tabeli będzie. Czasami warto uprościć tabele, które są najczęściej dostępne. Jest hit wydajności z JOIN jednak zawsze, gdy trzeba uzyskać dostęp do tych danych osobowych, więc to coś, co musisz rozważyć.

EDIT -- wiesz co, właśnie coś wymyśliłem. Jeśli utworzysz indeks w polu Nazwa użytkownika lub e-mail (w zależności od tego, co wolisz), prawie całkowicie wyeliminujesz wadę wydajności polegającą na tworzeniu tak wielu kolumn w tabeli użytkownika. Mówię tak, ponieważ za każdym razem, gdy się zalogujesz, klauzula WHERE będzie bardzo szybka, aby znaleźć nazwę użytkownika, jeśli ma indeks i nie ma znaczenia, czy masz 100 kolumn w tej tabeli. więc zmieniłem swoje opinia. Umieściłbym wszystko w jednym stole. ;)

W obu przypadkach, ponieważ bezpieczeństwo wydaje się być popularnym tematem, hasło powinno być wartością hash. Sugerowałbym SHA1 (lub SHA256, jeśli naprawdę się tym martwisz). TempPassword powinien również używać hasha i jest tam tylko dla funkcji Zapomniałem hasła. Oczywiście z hash nie można odszyfrować i wysłać użytkownikowi swoje oryginalne hasło. Zamiast tego generujesz tymczasowe hasło, którym mogą się zalogować, a następnie zmuszasz ich do zmiany ich hasło ponownie po zalogowaniu.

 7
Author: Steve Wortham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-04 00:50:59

Po pierwsze, aby stwierdzić (miejmy nadzieję) oczywiste, jeśli można w jakikolwiek sposób uniknąć przechowywania nazw użytkowników i haseł zrobić to; jest to duża odpowiedzialność i jeśli twój sklep poświadczeń jest naruszony może zapewnić dostęp do wielu innych miejsc dla tych samych użytkowników (ze względu na udostępnianie hasła).

Jeśli musisz przechowywać dane uwierzytelniające:

  • nie przechowuj odwracalnej formy; przechowuj hash za pomocą uznanego algorytmu, takiego jak SHA-256. Używać oprogramowania kryptograficznego z renomowanego, godnego zaufania źródła - nie SPRÓBUJ TOCZYĆ WŁASNE, PRAWDOPODOBNIE SIĘ POMYLISZ.
  • dla każdego zestawu poświadczeń przechowuj sól wraz z hashowanymi danymi; jest to używane do "prime" hash tak, że dwa identyczne hasła nie wytwarzają tego samego hash - ponieważ daje to, że hasła są takie same.
  • Użyj bezpiecznego generatora losowego. Słaba losowość jest główną przyczyną błędów bezpieczeństwa związanych z szyfrowaniem, a nie algorytmów szyfrujących.

Jeśli musisz przechowywać odwracalne referencje:

  • Wybierz dobry algorytm szyfrowania-AES-256, 3DES (datowany) lub szyfr klucza publicznego. Używaj oprogramowania kryptograficznego z renomowanego, godnego zaufania źródła - nie próbuj zwijać własnego, prawdopodobnie pomylisz się.
  • dla każdego zestawu poświadczeń przechowuj sól (niezaszyfrowaną) wraz z zaszyfrowanymi danymi; jest to używane do "prime" szyfru szyfrującego, tak aby dwa identyczne hasła nie wytwarzały tego samego tekstu zaszyfrowanego - ponieważ daje to, że hasła są to samo.
  • Użyj bezpiecznego generatora losowego. Słaba losowość jest główną przyczyną błędów bezpieczeństwa związanych z szyfrowaniem, a nie algorytmów szyfrujących.
  • przechowuj klucze szyfrowania / deszyfrowania oddzielnie od bazy danych, w zabezpieczonym pliku O / s, dostępnym tylko dla profilu runtime aplikacji. W ten sposób, jeśli twój DB zostanie naruszony (np. przez SQL injection), Twój klucz nie będzie automatycznie podatny na ataki, ponieważ wymagałoby to dostępu do dysku twardego w ogóle. Jeśli twój O / S obsługuje szyfrowanie plików powiązane z profilem, użyj go - może tylko pomóc i jest ogólnie przejrzyste (np. szyfrowanie NTFS).
  • jeśli jest to praktyczne, przechowuj klucze same zaszyfrowane hasłem głównym. Zazwyczaj oznacza to Twoją aplikację. potrzebne będzie to hasło z kluczem przy starcie-nie ma sensu podawać go w parametrze ze skryptu, ponieważ jeśli dysk twardy zostanie naruszony, musisz założyć, że zarówno plik klucza, jak i skrypt mogą być wyświetlane.
  • Jeśli nazwa użytkownika nie jest konieczna do zlokalizowania konta rekord Szyfruj zarówno nazwę Użytkownika, jak i hasło.
 3
Author: Lawrence Dol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-03 23:02:38

Z mojego doświadczenia wynika, że przechowywanie danych osobowych i danych logowania w poszczególnych bazach danych jest najlepszą praktyką w tym przypadku. Powodem jest to, że jeśli ma miejsce wstrzyknięcie SQL, jest ono ograniczone (chyba że infiltrator zna wewnętrzny układ bazy danych) do tabeli, do której odnoszą się dane, w przeciwieństwie do zapewnienia dostępu do całego konglomeratu danych.

Należy jednak pamiętać, że może to nastąpić kosztem konieczności wykonania większej liczby zapytań, stąd wydajność hit.

 2
Author: Jason,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-04 01:07:47

Czy wszystkie te dane zawsze będą miały relację 1: 1 z użytkownikiem? Jeśli możesz forsee zezwalając użytkownikom na wiele adresów, numerów telefonów, itp, to możesz chcieć wyłożyć dane osobowe do osobnej tabeli.

 2
Author: dkaylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-04 01:24:32

Należy przechowywać je w tej samej tabeli i używać szyfrowania jednokierunkowego. MD5 będzie działać, ale jest słaby, więc można rozważyć coś w rodzaju SHA1 lub innej metody. Nie ma korzyści z przechowywania 2 pozycji w oddzielnych tabelach.

 0
Author: Ben Lakey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-03 22:38:39