2012-05-03 21 views
5

Bardzo często widzę .NET class Random używany do generowania haseł.Jak wykazać, że klasa .NET Random nie nadaje się do generowania haseł?

Z jednej strony, this question I asked earlier pokazuje, że generowanie grup "tajnych" danych przy użyciu class Random daje raczej przewidywalne dane. Z drugiej strony, obecnie próbuję wykonać tę dokładną prognozę, a mój kod działa z prędkością około sześciu milionów domieszek nasion dziennie na jednym rdzeniu - niezbyt szybko, upłynie prawie rok, aby wyliczyć wszystkie możliwe wartości początkowe w tym tempie.

Czy istnieje wyraźniejszy i szybszy sposób pokazania, że ​​hasła generowane przy użyciu danych z class Random() są znacznie słabsze niż zwykle się spodziewano?

+5

Dlaczego po prostu nie pokazać im odpowiedzi Eric Lipperta i pytania, które łączysz? Pokazuje nawet przykład generowania przypadkowych liczb kryptograficznych - jeśli próbujesz przekonać biznesowe umysły, wystarczy wspomnieć o kryptograficznym słowie :-P –

+0

Myślę, że masz logikę w niewłaściwy sposób. Jeśli istnieje aplikacja, która ma krytyczne znaczenie dla bezpieczeństwa, obciążenie spoczywa na tych, którzy proponują rozwiązanie, które zademonstruje, że rozwiązanie spełnia wymagania bezpieczeństwa. Wątpię, by ktokolwiek mógł to zrobić dla klasy losowej .NET. PRNG używane w aplikacjach kryptograficznych mają zdefiniowane właściwości bezpieczeństwa, więc można pokazać, że spełniają określone wymagania. –

Odpowiedz

0

Z mojego rozumienia, klasa Random generuje losowe wartości oparte na "losowym algorytmie Psuedo", więc w rzeczywistości nie są one przypadkowe, co-tak-kiedykolwiek. opierają się na konkretnej implementacji algorytmu matematycznego, więc wyniki są przewidywalne.

Więc jeśli próbowałem złamać ten algorytm, dla naruszenia bezpieczeństwa, nie, że chciałbym, muszę znać pewne informacje: Wiem, co to jest algorytm, to jest publicznie dostępne za pośrednictwem platformy .Net, co to jest wartości wejściowe (nasiona)?

Znowu nie można po prostu zakodować tych wartości wejściowych, muszą one być oparte na czymś, więc co z tego?

W twoim przykładzie spróbujesz, jak rozumiem, wygenerować wszystkie możliwe wartości początkowe. To, jak powiedziałeś, zajmuje dużo czasu!

Ale dlaczego miałbym to zrobić? najbardziej inteligentnym podejściem jest próba odgadnięcia, co używasz do generowania wartości wejściowych? Czy używasz czasu? Kiedy odzyskiwane są hasła? Kiedy wygenerowano to hasło? Jaki podzbiór wartości to daje? Jak dużą liczbę używasz?

Jeśli możesz przetestować 6 milionów nasion dziennie, to ile wartości przy zastosowaniu pewnej logiki zawęzi zestaw możliwych wartości do? Jeśli to będzie 6 milionów, mogę złamać twoje hasło w ciągu 24 godzin.

To powiedziawszy, jeśli możesz sprawić, że twój podzbiór nasion będzie wystarczająco duży i nieprzewidywalny, będzie to trudne. Więc pytanie, jak wiele rzeczy w bezpieczeństwie, sprowadza się, jak bezpieczne musi to być? Nic nie jest w 100%!

+1

Twoje pierwsze trzy akapity odnoszą się do wszystkich powszechnie używanych RNG, prawda? Jeśli mam twoje algo i twoje nasienie, mogę uzyskać następną wartość. – Cylindric

+0

Prawda, ale złożoność jest tutaj problemem. Ale losowe ma tylko jeden klucz? Nie jest to zbyt skomplikowane, więc logika wymagana do odgadnięcia tego klucza jest łatwiejsza. Nie jest przeznaczony do losowego generowania haseł. Coś w rodzaju hasha MD5 zostało zaprojektowane do szyfrowania, więc jest bardziej złożone, ma wiele kluczy itd., Więc logika wymagana do powielenia wyniku jest o wiele bardziej złożona – Liam

+1

Jeśli używasz MD5, aby cokolwiek zrobić z hasłami i/lub szyfrowanie, równie dobrze możesz sobie nie przeszkadzać. – Cylindric

0

W oryginalnym pytaniu nikt nie mówi, że Random nie nadaje się do generowania losowych haseł (w rzeczywistości słowo "hasło" nie pojawia się nigdzie w pytaniu, odpowiedzi lub komentarzach). Będzie ci ciężko to udowodnić, ponieważ aby to zrobić, system będzie musiał wygenerować kilka losowych haseł naraz. Również atakujący będzie musiał jakoś dopasować nazwę użytkownika i hasło, nawet jeśli uda mu się zdobyć dużą liczbę haseł.

1

Pozwolę sobie to ująć w następujący sposób: Wybierz generator liczb losowych odpowiedni do liczby haseł, które chcesz wygenerować. Przy rozmiarze alfabetu 36 (cyfry i tylko wielkie lub tylko małe litery) wyodrębniasz tylko niewielki ułamek wewnętrznego stanu RNG. I nawet jeśli wygenerujesz 40000 znaków w ten sposób, to wciąż tylko około 21 bitów informacji. Twój algorytm w drugim pytaniu oprócz prefiksu generuje tylko 4 losowe znaki. Łatwiej będzie atakującemu wymusić na branie wszystkie możliwe hasła, zamiast brutalnie wymuszać stan RNG, aby znaleźć następne hasło do wygenerowania.

W rzeczywistości, najgorszym błędem, jaki możesz popełnić, gdy używasz prostego RNG do generowania haseł, jest wygenerowanie dużej ich liczby. Jeśli generujesz je tylko na żądanie i zawsze ze świeżo zaszczepionym RNG, atakujący będzie miał trudności z ustaleniem nasion, a tym samym hasła. Domyślna implementacja System.Random zabiera czas od uruchomienia systemu w milisekundach jako seed. Powodzenia w tym.

Powiązane problemy