2016-08-02 16 views
9

Potrzebuję wygenerować token jednorazowy w PHP. Dostępne są dwie funkcje, które można użyć do tego, które wydają się robić to samo: random_bytes i openssl_random_pseudo_bytes. Na przykład za pomocą random_bytes:Generowanie tokena jednorazowego użycia w PHP: random_bytes lub openssl_random_pseudo_bytes?

var_dump(bin2hex(random_bytes(12))); 

--> string(24) "338f489ec37a2c2b4943905d" 

i korzystania openssl_random_pseudo_bytes:

var_dump(bin2hex(openssl_random_pseudo_bytes(12))); 

--> string(24) "1c7febea20029bd524fba8e7" 

openssl_random_pseudo_bytes jest PHP 5.3 i do góry (tak zakładam, że to już dłużej), a random_bytes jest PHP 7. Używam PHP 7, więc mogę użyć albo.

Czy jest jakaś duża (lub mniej ważna w tej kwestii) różnica między tymi dwoma? Jeśli nie, to kusi mnie, aby przejść z random_bytes po prostu dlatego, że ma łatwiejszą nazwę (= kod, który jest łatwiejszy do odczytania).

+0

Nie istnieją żadne realne różnice. –

+0

Nie radzę ci już używać openssl .. wielu doradców bezpieczeństwa zgłasza mi, żebym przestał używać openSSL –

+2

O ile mi wiadomo, sposób generowania bajtów przez 'random_bytes' zależy od platformy, ale drugi będzie wymagał rozszerzenia openssl. – frz3993

Odpowiedz

8

openssl_random_pseudo_bytes jest częścią OpenSSL rozszerzenie, które musi być jawnie configured and included w procesie kompilacji PHP i wymaga zewnętrznych zależności.

random_bytes jest nowy w PHP 7 jako natywna zawsze dostępna metoda PHP do generowania losowych bajtów, która wybiera swoje wewnętrzne źródło losowości w zależności od platformy, na której jest.

Głównym powodem wprowadzenia random_bytes było to, że generowanie pseudolosowych danych zawsze było bolesne w PHP, wymagające od deweloperów bycia zorientowanym na platformę i ewentualnie używania kilku różnych metod rezerwowych w zależności od tego, które rozszerzenia lub funkcje na poziomie systemu są dostępne. Często prowadziło to do błędów w poszczególnych wdrożeniach, co w szczególności dotyczy kodu związanego z bezpieczeństwem. random_bytes upraszcza to poprzez zapewnienie jednej funkcji, która jest zawsze dostępna i wykorzystuje najlepsze dostępne źródło losowości. Jeśli możesz kierować wyłącznie do PHP 7+, powinna to być Twoja metoda.

1

Według instrukcji php

random_bytes: generuje kryptograficznego pseudolosowych bajtów openssl_random_pseudo_bytes: Generowanie ciąg pseudolosowych bajtów

tak Główną różnicą jest kryptograficznie bezpieczny

W openssl_random_pseudo_bytes() Funkcja PHP wywołuje RAND_psuedo_bytes() funkcji OpenSSL którym Dokumenty OpenSSL powiedzieć powinny być stosowane tylko dla celów Niekryptograficzne:

https://paragonie.com/blog/2015/07/how-safely-generate-random-strings-and-integers-in-php

+0

Parametr wyjściowy 'crypto_strong' wskazuje, czy metoda openssl zwróciła łańcuch bezpieczny kryptograficznie, czy też nie (w zależności od platformy). – SilverlightFox

+0

masz rację, ale nadal nie sugeruję tego dla problemów związanych z bezpieczeństwem, które są zgłaszane podczas ostatniej konferencji php w Stambule PHPKonf http://phpkonf.org/ (Alexander Makarov) –

Powiązane problemy