Argon2 jest nowoczesnym algorytmem szyfrowania jednostronnego. Jest on zalecany do szyfrowania haseł po tym jak wygrał konkurs Password Hashing Competition w Lipcu 2015
Algorytm został zaprojektowany w taki sposób, aby optymalnie wykorzystać dostępną pamięć oraz dostępne jednostki obliczeniowe, zapewniając jednocześnie ochronę przed atakami.
W przeciwieństwie do Bcrypt, który mógł być parametryzowany tylko jednym czynnikiem -“koszt”, Argon2 jest parametryzowany przez trzy różne czynniki:
- Koszt pamięci, który określa użycie pamięci przez algorytm.
- Koszt czasu, który określa czas wykonania algorytmu i liczbę iteracji.
- Współczynnik równoległości, który określa liczbę równoległych wątków.
Argon2 występuje w dwóch wariantach: Argon2i i Argon2d. Argon2i lepiej nadaje się do szyfrowania haseł i uzyskiwania kluczy na podstawie haseł, natomiast Argon2d jest szybszy i wysoce odporny na ataki polegające na łamaniu GPU.
Jak skorzystać z Argon2 w php
Algorytm szyfrowania Argon2 został dodany do języka PHP w wersji 7.2 Bez instalacji dodatkowych modułów możemy skorzystać z jego możliwości.
Od jakiegoś czasu twórcy PHP zalecają funkcje password_hash() do szyfrowania haseł. Jeżeli chcesz użyć w procesie szyfrowania tytułowego algorytmu, wystarczy że podasz jako drugi parametr PASSWORD_ARGON2I lub PASSWORD_ARGON2ID – są to stałe określające typ algorytmu kryptograficznego.
<?php $pass = 'hasło'; $hash = password_hash($pass, PASSWORD_ARGON2I); var_dump($hash);
Funkcja zwraca string z hashem hasła wykonanym za pomocą wybranej opcji.
Tak jak wspomniałem powyżej, algorytm można parametryzować. Trzecim argumentem funkcji password_hash jest tablica z parametrami.
Dla Argon2 konfiguracja będzie wyglądać następująco:
<?php $params = [ 'memory_cost' => //(integer) Maksymalna wartość wykorzystywanej //pamięci w kb. Domyślnie ASSWORD_ARGON2_DEFAULT_MEMORY_COST 'time_cost' => //(integer) Maksymalna wartość czasu jaką może zabrać //algorytm. Domyślnie PASSWORD_ARGON2_DEFAULT_TIME_COST 'threads' => //(integer) Ilość wątków dostępnych do obliczeń. //Domyślnie PASSWORD_ARGON2_DEFAULT_THREADS ];
Szyfrowanie Argon2 w Symfony
Argon2 w Symfony pojawił się już w wersji 3.4. Nie był jednak to domyślny sposób szyfrowania, pozostał nim bcrypt. Nie było też możliwości ustawienia algorytmu zgodnie z naszymi wymaganiami.
W symfony 4.1 w komponencie `securit-bundle` została dodana konfiguracja. Od tego momentu można wybrać jako encoder haseł argon2 i sparametryzować go.
Przykładowa konfiguracja:
# config/packages/security.yaml security: encoders: App\Entity\User: algorithm: 'argon2i' memory_cost: 1024 time_cost: 3