Nowości w PHP 7.2 - zabezpieczanie haseł algorytmem Argon2

Wiadomość dodana: 31 sierpnia 2017.

Premiera PHP 7.2 coraz bliżej a wraz z nią spore zmiany usprawniające bezpieczeństwo aplikacji. Przestarzałe i nierozwijane od lat rozszerzenie Mcrypt (w PHP 7.1 oznaczone jako “deprecated”) zostanie całkowicie usunięte, a w jego miejsce pojawi się ext/sodium – będące wrapperem do biblioteki libsodium. Drugą ważną zmianą jest dodanie algorytmu hashującego Argon2. Oba usprawnienia sprawiają, że PHP staje się bezpieczniejszym środowiskiem, implementując najnowsze rozwiązania współczesnej kryptografii.

Algorytm Argon2 został zwycięzcą Password Hashing Competition i jako następca bcrypt i scrypt jest obecnie zalecany do zabezpieczania haseł. Argon2 zawiera zabezpieczenia przeciwko atakom brute-force poprzez wykorzystanie predefiniowanego rozmiaru pamięci, czasu CPU oraz odpowiedniego poziomu paralelizmu (Instruction Level Parallelism). Wykorzystuje 3 parametry które kontrolują rozmiar pamięci, czas wykonywania oraz liczbę wykorzystanych wątków.

Występują dwie odmiany algorytmu: Argon2i oraz Argon2d. Argon2i jest skuteczny przeciwko atakom side-channel – dlatego dobrze nadaje się do hashowania haseł – to on został zaimplementowany w PHP 7.2. Argon2d zapewnia lepszą ochronę przeciwko atakom opartym o crackowanie z użyciem GPU.

Użycie algorytmu Argon2i

Samo użycie algorytmu Argon2i jest niezwykle proste – został on dodany do funkcji password_hash (oraz pochodnych):

string password_hash ( string $password , integer $algo [, array $options ] )

Drugi argument definiuje użyty algorytm, w tym wypadku zdefiniowany jako stała PASSWORD_ARGON2I. Dla przykładu:

$password = 'test';
$hash = password_hash($password, PASSWORD_ARGON2I);
var_dump($hash);
// $argon2i$v=19$m=1024,t=2,p=2$TmxLemFoVnZFaEJuT1NyYg$4j2ZFDn1fVS70ZExmlJ33rXOinafcBXrp6A6grHEPkI

Łączna długość ciągu to 98 znaków, gdzie poszczególne segmenty rozdzielone są znakiem dolara.

1. argon2i
2. v=19
3. m=1024,t=2,p=2
4. TmxLemFoVnZFaEJuT1NyYg
5. 4j2ZFDn1fVS70ZExmlJ33rXOinafcBXrp6A6grHEPkI

1. oznacza użyty algorytm
2. bieżącą wersję
3. listę parametrów powiązanych z wykorzystaniem pamięci (w kB), czasu CPU i wątków
4. losową sól (domyślnie 16 bajtów). Oznacza to, że kolejne wywołania funkcji dla tego samego hasła będą zwracały inny ciąg
5. zakodowaną wartość (domyślnie 32 bajty)

Możliwe jest także uzyskanie informacji o zahashowanym ciągu przy użyciu funkcji password_get_info:

array(3) {
  ["algo"]=>
  int(2)
  ["algoName"]=>
  string(7) "argon2i"
  ["options"]=>
  array(3) {
    ["memory_cost"]=>
    int(1024)
    ["time_cost"]=>
    int(2)
    ["threads"]=>
    int(2)
  }
}

Dodatkowe opcje jakie możemy przekazać do funkcji password_hash() to:

$options = [
    'memory_cost' => 1<<10, // 1024
    'time_cost'   => 4,
    'threads'     => 3,
];

W przypadku gdy opcja nie może być wykorzystana PHP wygeneruje warning (E_WARNING).

Chociaż wszystkie parametry domyślne dobrane są tak, aby być bezpiecznymi, to ze względu na szerokie użycie PHP na różnych maszynach (w tym niezbyt szybkich hostingach o ograniczonych zasobach) zalecanie jest dopasowanie opcji do konkretnej konfiguracji sprzętowej. Więcej o tym można przeczytać w wiki PHP.

Komentarze

Nie ma jeszcze żadnych komentarzy do wyświetlenia. Może chcesz zostać pierwszą osobą która podzieli się swoją opinią?

Dodaj komentarz

*
Nazwa zostanie wyświetlona wraz z komentarzem. Możesz też utworzyć nowe konto w serwisie, dzięki czemu uzyskasz dodatkową funkcjonalność.
*
Akceptowana jest ograniczona składnia Textile. Wszystkie tagi HTML zostaną usunięte.