Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Bezpieczny token, openssl_random_pseudo_bytes, token, klucz
darek334
post 20.03.2017, 17:29:04
Post #1





Grupa: Zarejestrowani
Postów: 87
Pomógł: 3
Dołączył: 23.04.2013

Ostrzeżenie: (30%)
XX---


Witam,
Napisałem taki kod do generowania bezpiecznych ciągów znakowych :
  1. function str_random(int $length = 16){
  2.  
  3. $token = '';
  4. $hex_char_array = array();
  5. $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  6. $strlen = strlen($characters)-1;
  7.  
  8. for($i = 0; $i <= $strlen; $i ++){
  9. $hex_char_array[base_convert(ord(substr($characters, $i, 1) ),10,16)] = substr($characters, $i, 1);
  10. }
  11.  
  12. while(strlen($token) < $length){
  13. $randomhex = bin2hex(openssl_random_pseudo_bytes($length * 3 ) );
  14. $random_hex_lenghth = strlen($randomhex) - 2;
  15.  
  16. for($i = 0; ($i <= $random_hex_lenghth && strlen($token) < $length); $i += 2 ){
  17. $hex_from_random = substr($randomhex, $i, 2);
  18. if(isset( $hex_char_array[$hex_from_random] ) ){
  19. $token .= $hex_char_array[$hex_from_random];
  20. }
  21. }
  22. }
  23. unset($hex_char_array, $characters, $strlen, $randomhex, $random_hex_lenghth, $i);
  24. return $token;
  25. }
  26.  

Tworzony jest tu ciąg ze znaków z puli a-zA-Z i 0-9, czyli podstawowe literki ASCII, bo taki jest wymóg. Przewertowałem internet i głównie z tego co tam piszą np na http://stackoverflow.com to coś takiego :
http://stackoverflow.com/questions/4356289...tring-generator
głównie próbuje się tam używać niezalecanych funkcji np rand() itp, albo jeżeli już ktoś jest mądrzejszy to korzysta z funkcji zalecanych przez PHP czyli np : openssl_random_pseudo_bytes manual: manualu, ale to jest żadkość , aby to znaleźć to trzeba specjalnie w google wpisać openssl_random_pseudo_bytes. Oczywiście, jak już napisałem ten kod powyżej, to znalazłem na tym forum taki oto przykład korzystający z array_rand, który jak widać jest bardzo prosty i robi w sumie to samo co założyłem. Pech chciał że przeszukując internet nie trafiłem na taki przykład, bo jest prosty i szybki mimo że też ta funkcja nie jest zalecana.
http://forum.php.pl/index.php?showtopic=114059
W sumie dodatkowe pytanie to o co chodzi z tym bezpieczeństwem , czy polegamy na opinii wydawcy który jak twierdzi że to się nie nadaje do celów związanych z bezpiecznym generowaniem liczb losowych to tak jest, czy jest inne jakieś wytłumaczenie o którym nie wiem.
Tak więc napisałem taki kod jak wyżej w oparciu o openssl_random_pseudo_bytes, bo takie przykłady przewijały się w lepszych przykładach na stronach don tego poświęconych. Mimo "fachowości" tych stron to kody te były dalekie od doskonałości mało tego powielały te same proste niedociągnięcia. Po pierwsze mało kto zwracał uwagę na oczywisty fakt, że openssl_random_pseudo_bytes po przerobieniu przez bin2hex() zwraca łańcuch tylko w formie szesnastkowego ciągu. Ciągu dużo prostszego i mocno ograniczonego, co przedkłada się na jego bezpieczeństwo itp. Wygląda też na to że ciąg z openssl_random_pseudo_bytes można tylko zamienić na postać szesnastkową, nigdzie w manualu PHP nie znalazłem metody która by potrafiła to zamienić w jakiś inny sposób, np znaki albo cyfry, ale pozostawić tak tego nie można. Na tych stronach często jednak zostawiano taki ciąg bez dalszej obróbki. W wielu z tych przykładów jakby nie zauważano, że podając parametr do długości ciągu i przerabiając go przez bin2hex, w wyniku dostajemy ciąg dwa razy dłuższy co jest wiadome, bo to jest reprezentacja szesnastkowa każdej liczby. Nie wiem może miałem pecha i tylko na takie przykłady natrafiałem, więc postanowiłem napisać taki kod sam jak powyżej zamieściłem. Przykłady ze znanej strony o programowaniu :
http://stackoverflow.com/questions/4356289...tring-generator
Dosyć dobry jest kod autora Arciszewski , bo krótki i faktycznie używający funkcji zalecanej przez PHP random_int(). Ale tam jest jakiś błąd, bo używa chyba starej funkcji :
mb_strlen wystarczy zmienić to na strlen i wszystko działa, krótki i działający.
Kilka słów jeszcze o moim kodzie dlaczego akurat tak a nie inaczej. Po pierwsze musimy sobie ustalić pule dozwolonych znaków z których może być zrobiony token, nie zawsze możemy go zrobić z dowolnych znaków, np klucze w tablicach przy nietypowym znaku wywalają błąd , aby temu zapobiec po to wymyślono base64_encode, ale to inna historia. Pulę zamieniłem na tablicę o kluczach odpowiadających znakom pochodzącym z łańcucha puli , nie na wartości w tablicy -to bardzo ważne. Teraz losujemy bezpieczny łańcuch szesnastkowy za pomocą openssl_random_pseudo_bytes. Oczywiście najprościej, by było zamienić wartości szesnastkowe na znaki, ale okazuje się że mogły by nie pasować do puli dozwolonych znaków. Po to jest tablica stworzona z puli dozwolonych znaaków, aby móc teraz wybrać/sprawdzić znaki. Wykonuje się to przez sprawdzanie istnienia zmiennej za pomocą isset(), bo jest to szybsze niż za każdym razem sprawdzanie wszystkich wartości tablicy. Ponieważ w losowym ciągu może być mniej znaków dozwolonych niż poszukujemy to powiększam to trzy krotnie na wszelki wypadek, oraz w funkcji,i jeśli token będzie zbyt krótki to tworzony jest nowy, tak więc jakby złożoność sie zwiększa.
No nie wiem, czy ten kod który napisałem jest coś wart, bo raz że długi dwa, że nie wiem czy tak naprawdę inaczej tego nie da sie zrobić. Proszę o opinie.

Ten post edytował darek334 21.03.2017, 09:56:19
Go to the top of the page
+Quote Post
viking
post 20.03.2017, 17:32:55
Post #2





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


http://php.net/manual/en/function.random-bytes.php


--------------------
Go to the top of the page
+Quote Post
viking
post 20.03.2017, 18:56:31
Post #3





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


To może sobie najpierw odpowiedź na pytanie do czego to ma służyć? Chodzi o wygenerowanie losowych znaków więc co za różnica co zawierają? na githubie jest pełno gotowych generatorów.


--------------------
Go to the top of the page
+Quote Post
daniel1302
post 29.04.2017, 14:24:25
Post #4





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


Od czego sa wyjątki ? sad.gif

Ten post edytował daniel1302 29.04.2017, 14:24:55
Go to the top of the page
+Quote Post
Puszy
post 8.05.2017, 15:00:14
Post #5





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

Ostrzeżenie: (0%)
-----


Bez sensu. Kto normalny użyje "biblioteki" która zabija skrypt die() w jeden z najgorszych sposobów zamiast normalnie po ludzku rzucić wyjątkiem tak aby funkcja z niej korzystająca mogła odpowiednio zareagować? Jak dla mnie kod jest bezużyteczny, wręcz niebezpieczny dla jakiegokolwiek modułu/aplikacji/CMSa etc.

Cytat(darek334 @ 29.04.2017, 12:11:15 ) *
i kończymy skrypt. Czemu tak, bo obsługa błędu itp mija się z celem, z doświadczenia powiem, że taki generator jest w wielu miejscach i teraz męczyć interpreter obsługą czegoś co musi działać i jest odpowiedzialne za bezpieczeństwo, nie ma sensu. Po za tym jakieś false itp może gdzieś nieopatrznie być zinterpretowane jako token o wartości 0 albo "" i mamy problem, dlatego z tego względu nanoszę tu poprawki. Czemu die(), bo nie wykonuje on juz żadnych instrukcji i definittywnie kończy skrypt.
pzdr. D.


Ten fragment dał mi raka, serio. Słyszałeś kiedyś o porównywaniu poprzez === korzystanie z funkcji typu is_bool()? Zachęcasz ludzi do korzystania z tego a nie chcesz dodać wyjątków bo Tobie to nie leży. Śmiało, nie używaj, nie musisz. Ale jeżeli miałbym z tego korzystać i np flush do bazy miałbym za pobraniem tego "bezpiecznego" tokena to mogłoby to np doprowadzić do niekończącej się próby pobrania tokena. Nie korzystam z die() i niech ktoś mnie poprawi jeżeli mówię źle ale przy die() nie działa chyba nawet shutdown handler. Najbardziej mnie dziwi Twoja arogancja, wszyscy Ci tu mówią że robisz to źle a Ty idziesz w zaparte.

Ten post edytował Puszy 8.05.2017, 15:10:54
Go to the top of the page
+Quote Post
Puszy
post 8.05.2017, 15:14:39
Post #6





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

Ostrzeżenie: (0%)
-----


Cytat(darek334 @ 8.05.2017, 16:08:31 ) *
Witaj,

dzięki za uwagę. Napisałem wyżej, że błąd należałoby sobie samemu obsłużyć, bo nie mam pomysłu na złoty środek, jeden by chciał definitywnie zakończyć skrypt bo ma on gwarantować bezpieczny token , więc w przypadku niepowodzenia , zakończyć cały skrypt, inny tak jak Ty twierdzi że powinien być wyjątek.


Jak mam samemu obsłużyć błąd skoro zabijasz cały proces, cały PID a nie działanie swojej funkcji. Dobra a jak widzisz taką sytuację: mam funkcję odpalaną z wiersza poleceń ustawioną na CRONie. Taki job ma za zadanie wygenerowanie tokena i zapisanie go do bazy i XYZ gdzie XYZ musi wykonać się po wygenerowaniu tokena niezależnie czy token jest czy też go nie ma. Jaki masz pomysł na obsługę tego z Twoimi die() w kodzie.
Go to the top of the page
+Quote Post
nospor
post 8.05.2017, 15:22:31
Post #7





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




Cytat
Napisałem wyżej, że błąd należałoby sobie samemu obsłużyć, bo nie mam pomysłu na złoty środek
zlotym srodkiem jest WYJATEK.
Jak ktos bedzie chcial zrobic DIE to sobie zlapie wyjatek i zrobi DIE. Ja rozumiem ze napisales super hiper "bezpieczny" token, ale to nie zmienia faktu ze lezysz na podstawach wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Puszy
post 8.05.2017, 15:25:42
Post #8





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

Ostrzeżenie: (0%)
-----


Cytat(darek334 @ 8.05.2017, 16:17:06 ) *
Przecież Ci napisałem, że należy obsłużyć sobie to samemu, nie rozumiesz zdania ? smile.gif


Aha, czyli udostępniasz bibliotekę i mam ją sobie zedytować? Nie no, w takim razie to wiele wyjaśnia. Pobiorę klasę i ją sobie dostosuje ingerując w kod. Mi pasuje.

...

Sorry, nie lubię się angażować emocjonalnie na forum ale Twoje podejście do tematu jest straszne. Mam nadzieję że nie żyjesz z programowania. Bo to co piszesz jest tak złe że witki opadają, każdy się uczył PHP, nawet ja mam gdzieś tu na forum wrzuconą klasę która jest totalnie bez sensu ale wyciągnąłem z niej jakieś wnioski "Hmm, faktycznie, on ma rację. Ta klasa w niczym nie pomoże." a Ty bezczelnie twierdzisz że Twój kod jest zajebisty i to ja nie ogarniam bo mogę sobie go zedytować.
Go to the top of the page
+Quote Post
Puszy
post 8.05.2017, 15:53:04
Post #9





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

Ostrzeżenie: (0%)
-----


Cytat(darek334 @ 8.05.2017, 16:44:13 ) *
Pisałem wyżej tak, zrobiłem jak zrobiłem, teraz każdy jak chce to wykorzystać niech wstawi sobie throw zamiast die(), albo exit, który to wykonuje jeszcze funkcje zarejestrowane register_shutdown_function i już, ale dzięki za uwagi, to mi coś daje na przyszłość.

O jezu chłopie ale poleciałeś, to coś z usterką ego w twoim przypadku, albo brakiem pewności siebie ! Ponieważ zajmuję się nauką ścisła , nie programowaniem bo ono dla mnie nie jest nauka ścisłą. To tak logicznie rozkładając :
1. poproszę o dowód bezczelności w moich postach
2. poproszę o dowód na bezużyteczność tego kodu, bo zakończenie które można sobie zmienić o czym wcześniej informowałem zainteresowanych o tym nie świadczy, tzn nie jest jego błędem. Kod ma zwrócić na pewno bezpieczny kod, w przypadku niepowodzenia zakańcza się skrypt - koniec założeń. Teraz wytknij w wykonaniu błąd niezgodny z złożeniami.
3. Poproszę o zacytowanie w którym miejscu twierdze że mój kod jest zajebisty. - nie wiem skąd takie wnioski skoro już na samum początku pytam się o sens kodu.

nie zgadzam się że leżę na podstawach, bo inaczej czegoś takiego bym nie napisał, to po pierwsze. Zgadzam się z wnioskiem o wyjątku, coraz bardziej mnie to przekonuje, że tak to powinno wyglądać, zwłaszcza jeżeli takie sa standardy o których mogłem nie wiedzieć.


Leżysz na podstawach i to nawet nie PHP czy programowania a logicznego tworzenia algorytmu.

Zapraszam do lektury: https://www.w3schools.com/php/php_exception.asp

Ten post edytował Puszy 8.05.2017, 15:53:42
Go to the top of the page
+Quote Post
Puszy
post 8.05.2017, 15:56:08
Post #10





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

Ostrzeżenie: (0%)
-----


Cytat(darek334 @ 8.05.2017, 16:54:23 ) *
jest to przedmiotem badań i wielu sporów Jest coś takiego jak inteligencja emocjonalna. ponieważ emocje napędzają nasze motywacje, co jest udowodnione po przez obserwacje, przyjmując taką tezę muszą być pożyteczne, ale nie koniecznie prowadzić do rozwiązania. Bez emocji człowiek i każda istota jest bierna.


Przedstaw to w postaci kodu biblioteki wykorzystującego die().
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.04.2024 - 15:24