Najlepszy sposób na przechowywanie hasła w bazie danych [zamknięty]

Pracuję nad projektem, który musi posiadać uwierzytelnienie (nazwa użytkownika i hasło)

Łączy się również z bazą danych, więc pomyślałem, że będę tam przechowywać nazwę użytkownika i hasło. Jednak wydaje się, że nie jest to dobry pomysł, aby mieć hasła, jak tylko pole tekstowe w tabeli siedzącej w bazie danych.

Używam C# i podłączam się do serwera express 2008. Czy ktoś może zasugerować (z jak największą ilością przykładów), jaki byłby najlepszy sposób przechowywania tego typu danych być?

P. S jestem otwarty na pomysł, aby te informacje nie były przechowywane w bazie danych, jeśli można podać dobry powód

Author: JDoe, 2009-06-28

8 answers

Masz rację, że przechowywanie hasła w polu zwykłego tekstu to pomysł okropny . Jednak jeśli chodzi o lokalizację, w większości przypadków napotkasz (i szczerze mówiąc nie mogę myśleć o żadnych przeciw-przykładach) przechowywanie reprezentacji hasła w bazie danych jest właściwą rzeczą. Przez reprezentację rozumiem, że chcesz hashować hasło za pomocą salt (który powinien być inny dla każdego użytkownika) i bezpiecznego algorytmu 1-way I Przechowywać , że , wyrzucając oryginalne hasło. Następnie, gdy chcesz zweryfikować hasło, zahasz wartość (używając tego samego algorytmu i salt) i porównujesz ją z zahaszowaną wartością w bazie danych.

Tak więc, chociaż dobrze, że o tym myślisz i to jest dobre pytanie, to w rzeczywistości jest to duplikat tych pytań (przynajmniej):

rainbow tables aby wyjaśnić nieco dalej, niebezpieczeństwo związane z po prostu hashowaniem hasła i przechowywaniem polega na tym, że jeśli intruz zdobędzie twoją bazę danych, nadal może używać tego, co znane jest jako rainbow tables , aby być w stanie "odszyfrować" hasło (przynajmniej te, które pojawiają się w tęczowym stole). Aby to obejść, Programiści dodają do haseł sól , która po prawidłowym wykonaniu sprawia, że ataki rainbow są po prostu niewykonalne. Należy pamiętać, że powszechnym błędem jest po prostu dodanie tego samego unikalnego i długiego ciągu do wszystkich haseł; chociaż nie jest to straszne, najlepiej jest dodać unikalne sole do każdego hasła. przeczytaj to więcej.
 356
Author: Paolo Bergantino,
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-05-23 12:18:16

Background Nigdy ... naprawdę ... musisz znać hasło użytkownika. Chcesz tylko zweryfikować, że przychodzący użytkownik zna hasło do konta.

Hash It: Przechowuj hashowane hasła użytkowników (szyfrowanie jednokierunkowe) za pomocą silnej funkcji skrótu. Wyszukiwanie "C# encrypt passwords" daje mnóstwo przykładów.

Zobacz online SHA1 hash creator aby dowiedzieć się, co generuje funkcja haszująca (ale nie używaj SHA1 jako funkcji haszującej, użyj czegoś mocniejszego takich jak SHA256).

Teraz hashowane hasło oznacza, że ty (i złodzieje baz danych) nie powinieneś być w stanie odwrócić tego hasha z powrotem do oryginalnego hasła.

Jak go używać: Ale jak mam użyć tego zmasowanego hasła przechowywanego w bazie danych?

Kiedy użytkownik się zaloguje, poda ci nazwę użytkownika i hasło (w oryginalnym tekście) Wystarczy użyć tego samego kodu hashowego, aby hashować wpisane hasło, aby uzyskać zapisaną wersję.

Więc porównaj te dwa hashed passwords(hash bazy danych dla nazwy użytkownika i wpisanego & hashed password). Możesz sprawdzić, czy "co wpisali" pasowało "co oryginalny użytkownik wprowadził dla swojego hasła", porównując ich skróty.

Extra kredyt:

pytanie: gdybym miał twoją bazę danych, to czy nie mógłbym po prostu wziąć krakera jak John Rozpruwacz i zacząć robić hasze, dopóki nie znajdę dopasowania do Twoich przechowywanych, zahaszowanych haseł? (ponieważ użytkownicy wybierają krótkie, słownikowe słowa i tak ... powinno be easy)

Odpowiedź: Tak ... tak, mogą.

Więc powinieneś "posolić" swoje hasła. Zobacz artykuł na Wikipedii o soli

Zobacz " jak hashować dane za pomocą salt " C# przykład

 44
Author: joej,
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
2016-03-30 18:13:40

Jako hash utwardzony kluczem, przy użyciu bezpiecznego algorytmu, takiego jak sha-512.

 31
Author: nilamo,
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-28 01:59:46

Najlepszą praktyką bezpieczeństwa jest nie przechowywanie hasła w ogóle( nawet nie zaszyfrowane), ale przechowywanie solonego hasha (z unikalną solą na hasło) zaszyfrowanego hasła.

W ten sposób odzyskanie hasła ze zwykłego tekstu jest (praktycznie) niemożliwe.

 26
Author: Mitch Wheat,
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
2015-05-24 09:56:11

Polecam przeczytać artykuły dość z tęczowymi tabelami: co musisz wiedzieć o bezpiecznych schematach haseł [martwy link, Skopiuj z Internet Archive] i Jak bezpiecznie przechowywać hasło.

Wielu programistów, w tym ja, myśli, że rozumie Bezpieczeństwo i haszowanie. Niestety większość z nas po prostu nie.

 10
Author: zebrabox,
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
2014-11-12 09:19:44

Może jestem nieco off-topic, jak wspomniałeś o potrzebie nazwy użytkownika i hasła, a moje zrozumienie problemu nie jest co prawda najlepsze, ale czy OpenID jest czymś wartym rozważenia?

Jeśli używasz OpenID, to nie przechowujesz żadnych poświadczeń, jeśli dobrze rozumiem technologię i użytkownicy mogą używać poświadczeń, które już mają, unikając potrzeby tworzenia nowej tożsamości, która jest specyficzna dla Twojej aplikacji.

To może nie być odpowiednie, jeśli aplikacja, o której mowa, jest wyłącznie do użytku wewnętrznego

RPX zapewnia łatwy sposób na zintegrowanie obsługi OpenID z aplikacją.

 6
Author: Crippledsmurf,
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-28 03:10:43

W Twoim scenariuszu możesz rzucić okiem na asp.net członkostwo, dobrą praktyką jest przechowywanie hasła użytkownika jako zaszyfrowanego ciągu w bazie danych. możesz uwierzytelnić użytkownika, porównując zahaszowane hasło przychodzące z hasłem przechowywanym w bazie danych.

Wszystko zostało zbudowane do tego celu, sprawdź asp.net członkostwo

 3
Author: Ray Lu,
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-28 01:56:31

Chciałbym MD5 / SHA1 hasło, jeśli nie trzeba być w stanie odwrócić hash. Kiedy użytkownicy logują się, możesz po prostu zaszyfrować podane hasło i porównać je z Hashem. Kolizje Hash są prawie niemożliwe w tym przypadku, chyba że ktoś uzyska dostęp do bazy danych i zobaczy hash, dla którego już miał kolizję.

 2
Author: waiwai933,
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-28 01:55:50