Hasło i nazwa użytkownika – podstawa systemu logowania chyba każdej strony WWW na świecie. Użytkownik musi zadbać o długie i trudne do odgadnięcia hasło, ale to twórca systemu musi zadbać o jego bezpieczeństwo i odpowiednie przechowywanie.
Podczas projektowania takiego systemu, trzeba podjąć decyzję na temat wielu części składowych aplikacji. Jeden z takich etapów to wybór jaki algorytm hash’owania trzeba wykorzystać. Trzymanie hasła w formie zahashowanej jest ważne dla bezpieczeństwa hasła, np.: w momencie wycieku bazy danych.
Od lat korzystałem z bcrypt (kiedy pisałem w Symfony) lub pbkdf2 (teraz, gdy piszę w Django). Jednak ostatnio odkryłem coś nowego – Argon2. Niestety nie aktualizuję często swojej wiedzy w temacie hashów, a hasło przechowywane w aplikacji mojego autorstwa jest bezpieczne. Nawet po latach – dalej algorytmy te są uznane za bezpieczne, więc warto z nich korzystać. Jednak podczas konfiguracji nowej bazy, podczas integracji jednego z systemów logowania w popularnej grze oraz autorskiego API, zauważyłem nową opcję hashowania. Postanowiłem wykorzystać ten system hashowania, jednak pierw musiałem podsumować swoją wiedzę. Takie zestawienie więc dla Was przygotowałem.
Hasło hashowane bCrypt
bCrypt jest chyba najpopularniejszym algorytmem. Gdy hasło hashujemy jego sposobem jest bezpieczne, a samo hashowanie nie wymaga dużych zasobów – czyli jest szybkie. Algorytm stworzony przez Niels’a Provos’a oraz David’a Mazières’a stał się dla mnie podstawowych algorytmem pracy, a dzięki niemu hasło jest bezpiecznie hashowane. Jednakże jest to funkcja adaptacyjna, więc sama w sobie nie zachowa odpowiedniego zabezpieczenia, gdyż wymaga dobrej implementacji.
Udostępniono kilka wersji bCrypt, a najnowsza z numerkiem 2b udostępniona została w 2014 roku. bCrypt aktualnie jest uznany za bezpieczny i nie posiada znanych nam podatności. Jest wykorzystywany już od prawie 20 lat. W OpenBSD i kilku dystrybucjach (np.: SUSE) jest wykorzystywany jako algorytm do utrzymywania haseł, a jego implementacja jest dostępna w każdym popularnym języku programowania. Jednak ze względu na niskie zużycie pamięci może być w przyszłości podatny na ataki z wykorzystaniem GPU.
Hasło hashowane Pbkdf2
Tym razem coś co poznałem wraz z Django. Moim zdaniem jest nieco bardziej bezpieczny, gdyż wymaga stosowania soli o zmiennej długości i liczba iteracji może również być różna. Tak samo jak bCrypt – stosujemy go od wielu lat i nie ma znanych podatności. Tak samo jak bCrypt – ze względu na niskie wymagania może być podatny na ataki z wykorzystanie GPU.
W pierwszych implementacjach korzystaliśmy z SHA-1 jako funkcji pseudolosowej. Teraz to zmieniono i wykorzystujemy SHA-512, ewentualnie SHA-256 jak ktoś ma ochotę.
Pbkdf2 posiada modularny forma wyjścia, gdyż nie tylko obsługuje np.: formę tekstową (wykorzystywany w Django), ale również np.: wyjście heksadecymalne.
Hasło hashowane Argon2
Argon2 jest najmłodszym algorytmem. Hasło może dzięki temu być bezpieczniejsze lub wręcz przeciwnie – przez niedługi czas, można było jeszcze podatności nie wykryć. Pojawił się w 2015 roku, gdy wygrał PHC – Password Hashing Competition, co samo w sobie stanowi pewien rodzaj prestiżu i można dzięki temu fajnie zareklamować swoją aplikację, jako trendy i bezpieczną, a programiści aplikacji są na bieżąco z bezpieczeństwem. Tylko profitów, a nawet jeszcze hasło nie zmieniło się w hash.
Argon2 jest algorytmem hashującym, który możemy wykorzystywać do hashowania treści, danych logowania itp.
Jest fajnie wdrożony w Django.
Jest trudniejsza w obliczeniach w stosunku do swoich poprzedników, więc jest kosztowna. Wymaga stosunkowo dużej ilości pamięci oraz mocy obliczeniowe. Oznacza to tylko tyle, że przy odpowiedniej implementacji może być bezpieczniejsze przy atakach z wykorzystaniem GPU.
Podsumowanie
Patrząc po bezpieczeństwie, wybiorę jednak Argon2. Wymóg większej wydajności jednak nie przeważa nad minimalnie większym bezpieczeństwie, a przy małych i średnich aplikacjach nie zrobi to większej różnicy. Dopiero przy naprawdę dużej aplikacji zobaczymy realnie większe wymogi.
Zapraszam również do pozostałych artykułów mojego autorstwa.
Tak samo zapraszam do komentowania wpisu i podzielenia się swoimi opiniami.