To Matematyka.random ()

Jak dobre są algorytmy używane w Javascript Math.random() w różnych przeglądarkach? Czy można go używać do generowania haseł jednorazowych?

Ile bitów z jednego random mogę użyć?

Author: grep, 2011-04-13

5 answers

Nie; Funkcja JavaScript Math.random() nie jest bezpiecznym kryptograficznie generatorem liczb losowych. Lepiej skorzystać z JavaScript Crypto Library implementacji Fortuna, która jest silnym generatorem liczb pseudolosowych (spójrz na src/js/Clipperz/Crypto/PRNG.js) lub Web Crypto API dla getRandomValues

 36
Author: Teoman Soygul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:15

Nie jest w ogóle bezpieczny, a w niektórych przypadkach był tak przewidywalny, że można było odbudować wewnętrzny stan PRNG, odjąć ziarno i tym samym wykorzystać go do śledzenia ludzi na stronach internetowych, nawet jeśli nie używali plików cookie, ukryli się za routingiem cebuli itp...

 16
Author: Bruno Rohée,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-25 10:13:02

Od marca 2013, okno.krypto.getRandomValues jest "technologią eksperymentalną" dostępną od Chrome 11 i Firefox 21, która pozwala uzyskać kryptograficznie losowe wartości. Ponadto, Zobacz getRandomValues z ostatniego szkicu W3C Web Cryptography API.

Opis:

Jeśli podasz liczbę całkowitą TypedArray (tj. Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, lub Uint32Array), funkcja będzie wypełniać tablicę za pomocą kryptograficznie losowe liczby. Przeglądarka powinna używać silnego (pseudo) generatora liczb losowych. Metoda rzuca QuotaExceededError, jeśli żądana długość jest większa niż 65536 bajtów.

Przykład:

var array = new Uint32Array(10);
window.crypto.getRandomValues(array);

console.log("Your lucky numbers:");
for (var i = 0; i < array.length; i++) {
    console.log(array[i]);
}

Również odpowiedź na Jak losowa jest matematyka JavaScript.przypadkowy? odnosi się do tymczasowego śledzenia użytkowników w głównych przeglądarkach i wycieku informacji między domenami i ataków z 2008 roku, który omawia jak JavaScript Matematyka.funkcja random() wycieka informacje.

Aktualizacja: aby sprawdzić aktualny stan obsługi przeglądarki, sprawdź Modern.IE sekcja Web Crypto API , która również łączy się z Chrome, Firefox i Safari zgłaszanie błędów.

 8
Author: Kevin Hakanson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:50

Ponieważ nie możesz znać dokładnej implementacji przeglądarki (poza zamkniętymi grupami użytkowników, jak dla Twojego intranetu biznesowego) ogólnie uznałbym RNG za słaby.

Nawet jeśli możesz zidentyfikować przeglądarkę, nie wiesz, czy sama przeglądarka lub identyfikator agenta innej przeglądarki jest manipulowany. Jeśli możesz, powinieneś wygenerować numer na serwerze.

Nawet jeśli umieścisz dobry PRNG w swoim JavaScript, Twój serwer nie może wiedzieć, czy żądanie klienta pochodzi z niezmodyfikowanego skryptu. Jeśli numer trafi do twojej bazy danych i / lub zostanie użyty jako narzędzie kryptograficzne, nie warto w ogóle ufać danym od klienta. To prawda nie tylko dla ważności ( sprawdzasz wszystkie dane pochodzące od klienta, prawda?), ale także dla ogólnych właściwości, takich jak losowość.

 3
Author: Daniel Böhmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-30 10:07:21

Math.random() nie jest zabezpieczony kryptograficznie. Również Veracode wskaże to wystąpienie za pomocą

CWE - 331 (niewystarczająca Entropia)

Moglibyśmy wykorzystać SecureRandom do zaimplementowania podobnej funkcjonalności.

new SecureRandom().nextDouble();
 1
Author: DecKno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-17 11:53:16