KacperSzurek
Generowanie wartości losowych w komputerze nie jest tak proste jak rzut kostką w rzeczywistości.
Dlaczego więc nie warto używać Random w #java ? #od0dopentestera

Każdy szanujący się serwis posiada funkcjonalność resetowania hasła.
Użytkownik podaje na stronie swój adres email powiązany z kontem.
W tym momencie serwer sprawdza czy taki użytkownik istnieje w bazie danych.
Jeśli tak - generuje unikalny ciąg, który jest następnie zapisywany i wysyłany w emailu.
Następnie użytkownik odczytuje email i klika w zawarty tam odnośnik z zapisanym unikalnym kluczem.
Serwer sprawdza czy unikalny ciąg znajduje się w bazie danych - i jeśli wszystko się zgadza pozwala na zmianę hasła.

Nasz kod generujący unikalny token wygląda tak:

static Random r = new Random();
static String getToken() {
return Integer.toString(r.nextInt());
}

Gdzie zatem znajduje się dzisiejszy błąd?
Klasa Random jest generatorem liczb pseudolosowych.
Oznacza to że na podstawie niewielkiej ilości informacji - tak zwanego ziarna generuje ona deterministycznie kolejne liczby pseudolosowe.

Ziarno to może być zdefiniowane przez użytkownika - lub też jak w naszym przypadku ustawione automatycznie przez Jave.
Wystarczy więc odgadnąć jakie ziarno zostało użyte aby móc generować kolejne liczby tokena na własnym komputerze.

Do przywrócenia ziarna użyjemy kodu dostępnego na forum stackoverflow.
Do swojego działania potrzebuje on 2 kolejnych liczb wygenerowanych przez daną instancje klasy Random.

Jak je otrzymać? W przypadku funkcjonalności przypominania hasła jest to bardzo proste.
Wystarczy bowiem dwa razy poprosić o reset konta, do którego posiadamy uprawnienia a za trzecim razem spróbować zresetować konto admina.
Następnie odczytujemy 2 pierwsze wartości z maila, do którego dostęp posiadamy i przekazujemy je do funkcji.

Właśnie wygenerowaliśmy unikalny identyfikator, którego można by było użyć do resetowania hasła administratora.
Oczywiście zakładam tutaj, że mamy szczęście i pomiędzy naszymi próbami nikt inny nie wykonał tej samej akcji.

Jak zatem zabezpieczyć się przed tym problemem?
Zawsze używać klasy SecureRandom.

Identyczny problem istnieje również z klasą RandomStringUtils.

Tam jednak odzyskanie ziarna trwa nieco dłużej.

#security #bezpieczenstwo #programowanie #informatyka #it #nauka #technologia #ciekawostki
  • Najlepsze
  • Wszystkie komentarze
login-jest-zajety
@KacperSzurek: @Bruno_: ciekawostka - jak Cloudflare generuje liczby losowe? używa do tego lamp lava, w skrócie - filmują je i później z klatek tworzą ciągi losowych bajtów używanych później do generowania par kluczy prywatny-publiczny
Bruno_
Bruno_
68
@KacperSzurek az sie klasyk przypomnial (。◕‿‿◕。)

Jak stworzyć idealny generator znaków losowych?
Posadzić żółtodzioba przed VIMem i kazać mu z niego wyjść.
tertex
tertex
tertex
18
zarowka12
zarowka12
@Efeljot: no właśnie nie do końca :) Wejście analogowe będzie zbierało szum generowany przez różne źródła dookoła, z czego silnym źródłem będzie sieć elektryczna. Będziesz mieć wyraźną składową 50 Hz i szum już nie będzie biały. Plus składowe np. od przetwornic w zasilaczach. Ale do wielu zastosowań wystarczy :)
ProfesorBigos
ProfesorBigos
  • adult
7
Treść przeznaczona dla osób powyżej 18 roku życia...
EstradaOrNada
@KacperSzurek: jak jako gówniarz prawie 30 lat temu odkryłem programując jakieś głupotki na c64, że on zawsze po restarcie generuje ten sam ciąg liczb losowych to byłem w niezłym szoku.
login-jest-zajety
@ElegancikzPolski: idąc tą drogą wystarczy karta na PCI zbierająca szum z eteru i na jego podstawie też generujemy losowe liczby, albo jak napisałeś karta dźwiękowa i czuły mikrofon, zresztą losowość liczb to temat rzeka

a co do wykorzystywania dźwięku z ulicy/nagrań twarzy nie wiem czy by nie musieli się poddać jakiemuś odpowiednikowi RODO, co innego przechowywanie CCTV a co innego wykorzystywanie tego do generowania liczb
Przegrywek123
@zarowka12: @megawatt: @Royal_Email: @login-jest-zajety: https://youtu.be/SxP30euw3-0

Jedyna prawilna metoda generowania liczb losowych XD jeszcze możnaby zmodyfikować żeby liczyło czas między pojedynczymi rejestracjami
ProfesorBigos
@KacperSzurek: W końcu celowo tak zaprojektowano funkcję Random, żeby można było odtworzyć generowane przez nią elementy znając seed. Jest to często bardzo przydatne.
ElegancikzPolski
@login-jest-zajety: Debile.
Taki sam efekt uzyskali by nagrywając byle co, np. ulicę na zewnątrz.
Ale już by nie było takiego och, ah.
Efeljot