Cytat
2. Kod powinien być ściśle tajny. Wtedy atakujący nie wygeneruje sobie tablic tęczowych dla danego kodu, bo go nie zna!
Security through obscurity w pełnej okazałości. Nie, nie możesz zakładać, że atakujący nie poza kodu użytego podczas hashownia. Ma takie same szans na zdobycie kodu aplikacji jak i na zdobycie zrzutu/dostępu do bazy danych. Zabezpieczenie ma polegać na tym, że nawet w przypadku gdy atakujący ma dostęp do
wszystkich danych poza oryginalnym hasłem nie będzie wstanie złamać hasła.
Zawsze powinieneś zakładać najgorszą z możliwych sytuacji, czyli taką w której atakujący ma nieograniczony dostęp do danych.
Cytat
3. Czy 1 kod dla wszystkich jest mniej bezpieczny? Jeżeli atakujący uzyska dostęp do plików konfiguracyjnych, wtedy mamy problem. Zdarzają się takie wpadki na serwerach. Jeśli zapiszemy osobne kody dla każdego w bazie, atakujący ma podane wszystkie kody - nic, tylko generować tablice!
Jeżeli zrozumiałeś już błąd w swoim rozumowaniu to wiesz, że w obu przypadkach atakujący kod(y) oraz sposób ich połączenia z oryginalnym hasłem (ze źródła aplikacji).
Opcja z pojedynczym kodem ma dwie podstawowe wady: 1) Wystarczy wygenerować jedną tablicę (metodą słownikową czy brute-forcem) i już mamy niemal gwarantowany dostęp kilku(nastu) procent kont w serwisie - bo tyle kont będzie miało hasło pokroju "haslo2" czy "abcde"; 2) Jeżeli dwóch lub więcej użytkowników przypadkiem będzie miało takie samo hasło będą oni mieli również identyczny hash hasła.
Co w przypadku gdy mamy unikalną/losową sól dla każdego? Po pierwsze użytkownicy z takim samym hasłem będą mieli inny hash hasła. Po drugie - i co ważniejsze - zamiast generować jedną tablicę na całą bazę danych będziemy musieli wygenerować ją dla każdego pojedynczego użytkownika z osobna. Innymi słowy metoda z generowaniem tablic odpada dla atakującego, ponieważ jest bardziej kosztowna od bezpośredniego ataku słownikowego/brute-force'a.
A ile trwa wygenerowanie tablicy tęczowej? To zależy od użytego algorytmu hashowania. I właśnie dlatego MD5 czy SHA-1/-2 (256, 512) są złym rozwiązaniem. Procesor mojego laptopa wartego 2000 zł jest wstanie policzyć kilkaset tysięcy hashy MD5 na sekundę. Ten sam laptop jest wstanie policzyć kilkanaście-kilkadziesiąt hashy wykorzystujących m.in. blowfisha i odpowiednio przygotowaną sól. Co to oznacza? Oznacza to, że wygenerowanie tablicy tęczowej jest nieopłacalne, a jeżeli mielibyśmy to jeszcze powtarzać dla każdego użytkownika z osobna praktycznie niewykonalne. Ataki słownikowe/bf również stają się nieopłacalne.
Co do ciasteczek - tutaj niestety przejęcie ciasteczka właściwie równa się możliwości zalogowania się. Przejęcie nie jest specjalnie trudne, dlatego też ciastko nie powinno zawierać żadnych danych - jedynie losowy ciąg (ew. id użytkownika). Po każdorazowym zalogowaniu przy użyciu tego ciasteczka powinieneś je nadpisywać z nowym kodem deaktualizując stary. Sama aplikacja powinna zaś umożliwić użytkownikowi po zalogowaniu się deaktywację wszystkich istniejących kluczy "zapamiętaj mnie". Dodatkowa tabela w bazie danych z ID użytkownika, kluczem i datą dodania do bazy danych nie kosztuje Cię kompletnie nic.
EDIT:
Cytat
chodziło mi o to, że Blowfish to szyfr symetryczny, a nie algorytm hashujący prawdopodobnie chodziło Ci o ten "Blowfish keying schedule" który jest wspomniany w podanym przez Ciebie artykule
Oczywiście BlowFish to szyfr symetryczny i w żadnym wypadku nie powinno się go w takiej formie używać do przechowywania haseł - trochę niefortunny skrót myślowy z mojej strony.
Cytat
watpie, żeby osoba która zadala to pytanie miala tyle milionow userow w bazie żeby to robiło różnicę
Powiedzmy, że do przechowywnia haseł został użyty algorytm, który generuje hash w 0.05 sekundy (a spokojnie można pokusić się o 0.1 - 0.3 sekundy), a nie 0.000015 (np. taki MD5). Powiedzmy, że 2-3 dni na wygenerowanie tablicy można sobie spokojnie poczekać. Ale 666-999 dni, bądź 199800-332667 dni przy założeniu, że każdy ma unikalną sól (~550-~1000 lat) już nie bardzo. A w przykładzie założyłem, że w bazie jest raptem 3000 użytkowników.
Na koniec: zauważcie, że utrudnienie złamania hasła można podnieść nie kilkukrotnie, ale o kilka rzędów wielkości praktycznie zerowym kosztem w 5 minut.