SHA512 vs. Blowfish and Bcrypt [zamknięte]


222

Patrzę na algorytmy mieszające, ale nie mogę znaleźć odpowiedzi.

  • Bcrypt używa Blowfish
  • Blowfish jest lepszy niż MD5
  • P: Ale czy Blowfish jest lepszy niż SHA512?

Dzięki..

Aktualizacja:

Chcę wyjaśnić, że rozumiem różnicę między haszowaniem a szyfrowaniem. Tym, co skłoniło mnie do zadania pytania w ten sposób, jest ten artykuł , w którym autor nazywa bcrypt „adaptacyjnym haszowaniem”

Ponieważ bcrypt jest oparty na Blowfish, doprowadzono mnie do wniosku, że Blowfish jest algorytmem mieszającym. Jeśli jest to szyfrowanie, jak wskazano w odpowiedziach, wydaje mi się, że nie powinno być miejsca w tym artykule. Co gorsza, doszedł do wniosku, że bcrypt jest najlepszy. Co mnie również dezorientuje to to, że klasa phpass (używana do haszowania haseł, jak sądzę) używa bcrypt (tj. Blowfish, tj. Szyfrowanie). W oparciu o te nowe informacje, które mi opowiadacie (blowfish to szyfrowanie), ta klasa brzmi źle. Czy coś brakuje?


2
To nie jest źle; zobacz aktualizacje mojej odpowiedzi, aby wyjaśnić, jak działa bcrypt i dlaczego służy temu samemu celowi, co algorytm „jednokierunkowy” oparty na haszowaniu.
erickson

3
bcryptpo prostu ma domyślnie wyższy „współczynnik pracy”. Przyjmuje się, że SHA nie ... chyba że użyjesz passhash9, który może być użyty razem ze współczynnikiem pracy. dlaczego to pytanie jest zamknięte? daleki od odpowiedzi, ale bardzo ważny.

1
Link, o którym mowa, nie działa ...............
Pacerier,

Odpowiedzi:


320

Wystarczy stwierdzić, czy bcrypt lub SHA-512 (w kontekście odpowiedniego algorytmu, takiego jak PBKDF2) jest wystarczająco dobry . Odpowiedź brzmi: tak, każdy z algorytmów jest wystarczająco bezpieczny, aby doszło do naruszenia z powodu wady implementacji, a nie kryptoanalizy.

Jeśli nalegasz, aby wiedzieć, która jest „lepsza”, SHA-512 miał dogłębne recenzje NIST i innych. To dobrze, ale wykryto wady, które, choć nie nadają się teraz do wykorzystania, doprowadziły do ​​rywalizacji o nowe algorytmy mieszania SHA-3. Pamiętaj również, że badanie algorytmów mieszania jest „nowsze” niż badanie szyfrów, a kryptografowie wciąż się o nich uczą.

Chociaż bcrypt jako całość nie był tak dokładnie badany jak sam Blowfish, uważam, że bazowanie na szyfrze o dobrze zrozumiałej strukturze daje mu pewne nieodłączne bezpieczeństwo, którego brakuje uwierzytelnianiu opartemu na haszowaniu. Ponadto łatwiej jest używać typowych układów GPU jako narzędzia do atakowania skrótów opartych na SHA-2; ze względu na wymagania dotyczące pamięci, optymalizacja bcrypt wymaga bardziej specjalistycznego sprzętu, takiego jak FPGA z pewną wbudowaną pamięcią RAM.


Uwaga: bcrypt to algorytm wykorzystujący wewnętrznie Blowfish. Nie jest to sam algorytm szyfrowania. Służy do nieodwracalnego zasłaniania haseł, podobnie jak funkcje skrótu służą do wykonywania „skrótu jednokierunkowego”.

Algorytmy szyfrowania kryptograficznego zaprojektowano tak, aby niemożliwe było ich odwrócenie. Innymi słowy, biorąc pod uwagę tylko dane wyjściowe funkcji skrótu, powinno minąć „na zawsze”, aby znaleźć komunikat, który wygeneruje taki sam wynik skrótu. W rzeczywistości znalezienie jakichkolwiek dwóch komunikatów o tej samej wartości skrótu powinno być niewykonalne obliczeniowo. W przeciwieństwie do szyfru, funkcje skrótu nie są parametryzowane za pomocą klawisza; to samo wejście zawsze będzie generowało to samo wyjście.

Jeśli ktoś poda hasło, które jest skrótem do wartości zapisanej w tabeli haseł, zostanie uwierzytelnione. W szczególności, z powodu nieodwracalności funkcji skrótu, zakłada się, że użytkownik nie jest atakującym, który przechwycił skrót i odwrócił go, aby znaleźć działające hasło.

Teraz rozważ bcrypt. Używa Blowfish do szyfrowania magicznego ciągu, używając klucza „pochodzącego” z hasła. Później, gdy użytkownik wprowadzi hasło, klucz jest uzyskiwany ponownie, a jeśli tekst zaszyfrowany utworzony przez szyfrowanie przy użyciu tego klucza pasuje do zapisanego tekstu zaszyfrowanego, użytkownik jest uwierzytelniany. Tekst zaszyfrowany jest przechowywany w tabeli „hasło”, ale klucz pochodny nigdy nie jest przechowywany.

Aby złamać tutaj kryptografię, osoba atakująca musiałaby odzyskać klucz z tekstu zaszyfrowanego. Nazywa się to atakiem „znanym tekstem jawnym”, ponieważ atak zna magiczny ciąg znaków, który został zaszyfrowany, ale nie użyty klucz. Blowfish został gruntownie przebadany i nie są jeszcze znane żadne ataki, które pozwoliłyby atakującemu znaleźć klucz z jednym znanym tekstem jawnym.

Tak więc, podobnie jak nieodwracalne algorytmy kryptograficzne oparte na algorytmach, bcrypt wytwarza nieodwracalne dane wyjściowe z hasła, soli i współczynnika kosztów. Jego siła polega na odporności Blowfish na znane ataki w postaci zwykłego tekstu, co jest analogiczne do „pierwszego ataku przed obrazem” na algorytm skrótu. Ponieważ można go używać zamiast algorytmu skrótu do ochrony haseł, bcrypt jest myląco określany jako sam algorytm „skrótu”.

Zakładając, że tablice tęczy zostały udaremnione przez właściwe użycie soli, każda naprawdę nieodwracalna funkcja sprowadza atakującego na próbę i błąd. A szybkość, z jaką atakujący może przeprowadzić próby, zależy od szybkości tego nieodwracalnego algorytmu „mieszania”. Jeśli zostanie użyta pojedyncza iteracja funkcji skrótu, atakujący może wykonać miliony prób na sekundę, używając sprzętu kosztującego 1000 USD, testując wszystkie hasła o długości do 8 znaków w ciągu kilku miesięcy.

Jeśli jednak podsumowanie zostanie „zwrócone” tysiące razy, przetestowanie tego samego zestawu haseł na tym sprzęcie potrwa setki lat. Bcrypt osiąga ten sam efekt „wzmocnienia klucza”, iterując wewnątrz swojej procedury wyprowadzania klucza, a odpowiednia metoda oparta na haszowaniu, taka jak PBKDF2, robi to samo; pod tym względem obie metody są podobne.

Zatem moja rekomendacja bcrypt wynika z założeń 1), że Blowfish miał podobny poziom kontroli jak rodzina funkcji skrótu SHA-2, oraz 2) że metody kryptoanalityczne dla szyfrów są lepiej opracowane niż te dla funkcji skrótu.


4
+1 świetny post. Ale mam dwa pytania. Blowfish został zastąpiony przez twofish ponad dziesięć lat temu, czy system nie powinien wykorzystywać nowoczesnych prymitywów? Również tysiące iteracji wydają się marnotrawstwem w systemach takich jak aplikacje internetowe, w których wielu ludzi loguje się w danym momencie. Na przykład PBKDF2 jest implementowany tylko w scenariuszach, gdy jedna osoba loguje się jednocześnie, na przykład funkcja string2key dla zaszyfrowanego systemu plików. Używam powiedzenia „Jeśli jest zbyt ciężki, aby atakujący mógł go podnieść, to jest zbyt ciężki dla twojego serwera”. Co myślisz?
gawron

17
Nie sądzę, żeby było coś złego w używaniu bardziej nowoczesnego prymitywu. W miarę upływu czasu często odkrywane są podatności, a Twofish został opracowany przy użyciu wiedzy zdobytej przez Blowfish. Nie znam jednak konkretnych luk w zabezpieczeniach, które unieważniałyby korzystanie z Blowfish, więc można by również wysunąć argument „jeśli to nie jest złamane”. Twoje powiedzenie o atakujących nie brzmi dla mnie dobrze. Nawet jeśli wybierzesz algorytm, który wymagałby lat, aby atakujący przetestował miliard haseł, zajmie to znikomą część czasu w legalnej aplikacji.
erickson,

15
Jeśli spojrzysz na specyfikację dowolnej funkcji skrótu, nie zobaczysz nic na temat „salt”. Jedynym parametrem jest wiadomość do przetworzenia. Przejrzyj specyfikację dowolnego szyfru, a zobaczysz, że funkcja jest sparametryzowana za pomocą klucza. „Sól”, która może (ale nie musi) być używana w połączeniu z hashem, jest po prostu częścią wiadomości. Algorytm mieszania nie wymaga go, nie traktuje go specjalnie i nie może odróżnić go od reszty wiadomości. Tak więc, chociaż prawdą jest, że wiadomości są często zmieniane przez solenie, dana wiadomość wytwarza tylko jeden skrót.
erickson

1
@Andre D Jako pentester zgłaszam aplikacje, które blokują konta, i i Zgłaszam aplikacje, które nie zapobiegają brutalnej sile. Idealnie, że obrażający adres IP musi rozwiązać captcha, dodatkowo jeśli nazwa użytkownika jest celem (nawet jeśli ta nazwa użytkownika nie istnieje), to konto powinno rozwiązać captcha przed uwierzytelnieniem. Dopuszczalne jest również wymuszanie ograniczenia prędkości X na minutę. Powiązane: security.stackexchange.com/questions/25444/…
wieża

2
@rook: chociaż aplikacje ograniczające szybkość są dobrą praktyką, w tym przypadku można założyć, że baza danych została pobrana i umieszczona na sprzęcie, który nie ma opisanego ograniczenia prędkości.
Ellert van Koperen

50

Zgadzam się z odpowiedzią Ericksona, z jednym zastrzeżeniem: do celów uwierzytelniania hasła, bcrypt jest znacznie lepszy niż jedna iteracja SHA-512 - po prostu dlatego, że jest znacznie wolniejszy. Jeśli nie rozumiesz, dlaczego powolność jest zaletą w tej konkretnej grze, przeczytaj artykuł, do którego linkujesz ponownie (przewiń w dół do „ Prędkość jest dokładnie tym, czego nie chcesz w funkcji skrótu hasła ”).

Możesz oczywiście zbudować bezpieczny algorytm mieszania hasła wokół SHA-512, iterując go tysiące razy, tak jak działa algorytm MD5 PHK. Ulrich Drepper właśnie to zrobił , dla crypt () glibc. Nie ma jednak szczególnego powodu, aby to zrobić, jeśli masz już przetestowaną implementację bcrypt.


3
Mam nadzieję, że moja odpowiedź wyjaśnia, że ​​jedno powtórzenie skrótu nie jest wystarczające (niestety, nie można założyć nawet tego podstawowego poziomu wiedzy). „Jeśli zostanie użyta pojedyncza iteracja funkcji skrótu, osoba atakująca może wykonać miliony prób na sekundę przy użyciu sprzętu kosztującego 1000 USD, testując wszystkie hasła o długości do 8 znaków w ciągu kilku miesięcy. Jeśli jednak, podsumowanie jest „zwracany” tysiące razy, przetestowanie tego samego zestawu haseł na tym sprzęcie potrwa setki lat. Bcrypt osiąga ten sam efekt „wzmocnienia klucza” poprzez iterację… ”
erickson,

@erickson: Tak, choć myślę, że mogłeś tam pochować lede. Chodzi mi o to, że bezpośrednie porównanie bcrypt i SHA-512 nie jest tak naprawdę istotne, ponieważ jedna jest funkcją wyprowadzania klucza, a druga jest po prostu prymitywem kryptograficznym, sama w sobie nieodpowiednim.
caf


1
Używanie tysięcy rund SHA-512 nie jest niespotykane i biorąc pod uwagę jego włączenie do różnych cryptimplementacji (w tym PHP, których używam), kiedy przeczytałem oryginalne pytanie, nawet założyłem, że to właśnie OP miał na myśli, gdy zapytał o SHA-512 - że tak naprawdę miał na myśli tysiące rund SHA-512 kontra bcrypt, który sam używa setek lub tysięcy iteracji.
thomasrutter

33

Blowfish nie jest algorytmem mieszającym. To algorytm szyfrowania. Oznacza to, że możesz zaszyfrować coś za pomocą blowfish, a następnie możesz odszyfrować to z powrotem do zwykłego tekstu.

SHA512 jest algorytmem mieszającym. Oznacza to, że (teoretycznie) po skasowaniu danych wejściowych nie można odzyskać oryginalnych danych wejściowych.

Są to 2 różne rzeczy, przeznaczone do różnych zadań. Nie ma „poprawnej” odpowiedzi na „czy blowfish jest lepszy niż SHA512?” Równie dobrze możesz zapytać „czy jabłka są lepsze niż kangury?”

Jeśli chcesz przeczytać więcej na ten temat, oto kilka linków:


18
Myślę, że pytanie dotyczy użycia bcrypt jako nieodwracalnej ochrony haseł, podobnie jak w tym celu stosuje się haszowanie.
erickson

3
@erickson tekst „P: ale czy Blowfish jest lepszy niż SHA512?” wydaje mi się dość jasne i pokazuje, że OP nie rozumie różnic między dwoma algorytmami
Glen

1
OP tutaj. Właściwie, w oparciu o odpowiedź Glen'a, że ​​blowfish jest algorytmem szyfrującym (który, jak rozumiem, różni się od mieszania), teraz zdaję sobie sprawę, że moje pytanie „tak” było niejasne. Co jednak dezorientujące jest to, że klasa phpass (jak sądzę, używana do mieszania haseł) używa bcrypt (tj. Blowfish, tj. Szyfrowanie). Jeśli blowfish jest szyfrowaniem, dlaczego phpass używa go do haszowania haseł, wydaje mi się, że to wada, nie? Czy coś brakuje?
Chris

2
jednak pytanie dotyczy tego, które jabłka i kangury lepiej nadają się do określonego zadania. Blowfish jest lepszą funkcją haszującą niż sha ze względu na czas potrzebny na haszowanie. Większość implementacji sha, które widziałem, jest bardzo szybka. Chcesz powolnego algorytmu mieszania hasła.
John Nicholas

Ta odpowiedź jest poprawna, że ​​Blowfish jest algorytmem szyfrującym, ale w tym kontekście (np. Gdy jest używany w bcrypt) jest używany jako algorytm mieszający poprzez wyprowadzenie klucza z ciągu źródłowego i użycie go do zaszyfrowania magicznej liczby. To sprawia, że ​​jest on nieodwracalny, zasadniczo funkcja haszująca. Nie możesz obliczyć klucza z szyfru, nawet jeśli znasz zwykły tekst i zaszyfrowane dane.
thomasrutter

4

Blowfish nie jest lepszy niż MD5 lub SHA512, ponieważ służą one różnym celom. MD5 i SHA512 są algorytmami mieszającymi, Blowfish jest algorytmem szyfrującym. Dwie całkowicie różne funkcje kryptograficzne.


2

Poleciłbym implementację szyfrowania opartą na SHA-256 / SHA-512 Ulricha Dreppera.

Przenieśliśmy te algorytmy na Javę, a ich darmową wersję można znaleźć na ftp://ftp.arlut.utexas.edu/java_hashes/ .

Zauważ, że większość współczesnych (L) Unices obsługuje algorytm Dreppera w swoich plikach / etc / shadow.


PWDTK sourceforge.net/projects/pwdtknet używa HMAC-SHA512, jednak robi to w wielu iteracjach, aby stworzyć „powolność”, zwaną też Key Stretching, o czym mówili inni tutaj. BCrypt jest lepszy niż pojedynczy SHA-512, jak wspomniano, jednak jeśli używasz SHA-512 w czymś takim jak PBKDF2, to jesteś dobrze bezpieczny (dopóki używasz dużej krypto-losowej soli i wystarczającej liczby iteracji, aby zmusić czas do stwórz tęczową tabelę) API, które właśnie opublikowałem, jest zbudowane przeze mnie i zrobi to, co chcesz w .NET, jeśli to jest to, co tworzysz (dla korzyści dla przyszłych czytelników)
thashiznets

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.