2013-04-16 12 views
15

Potrzebuję generować kryptograficznie bezpieczne liczby pseudolosowe w języku JavaScript. Wiem o interfejsie API window.crypto.getRandomValues, który wykonuje dokładnie to, co chcę. Wiem jednak, że wprowadzono go stosunkowo niedawno (w 2011 r.).Zgodność okna.crypto.getRandomValues ​​()

Czy mogę bezpiecznie założyć, że window.crypto.getRandomValues jest obecny, czy też może to powodować problemy ze zgodnością niektórych przeglądarek? Czy są jakieś główne (szeroko używane) przeglądarki, które nie obsługują window.crypto.getRandomValues (w tym przeglądarek mobilnych lub stacjonarnych), a jeśli tak, to które z nich muszę się martwić? Z przyjemnością dowiem się, że istnieje wystarczająca pomoc, której nie muszę już martwić się o fallback methods, jeśli tak jest w istocie.

Odpowiedz

20

mogę bezpiecznie założyć window.crypto.getRandomValues ​​występuje

Jak zawsze zależy to od rynku docelowego i będzie się zmieniać w czasie. caniuse.com wyświetla listę obsługiwanych przeglądarek i oblicza wartość rynkową przeglądarki.

Oto podsumowanie:

  • IE 11: W/prefiks
  • IE Mobile 11: W/przedrostek

  • Firefox: 21+

  • Firefox Mobile: 21 +

  • Safari: od 6,1

  • Safari Komórka: 7,1

  • Chrome: 11+

  • Chrome for Mobile: 23+
  • Android przeglądarka: 4,4

  • Opera: 15+

  • Opera Mobile : 36+
  • Opera Mini: nie
+0

To jest fantastyczne! Dziękuję, Bobu. Niedawno znalazłem [inne źródło z Mozilli] (https://developer.mozilla.org/en-US/docs/DOM/window.crypto.getRandomValues#Browser_Compatibility). Jedyna rozbieżność z twoją odpowiedzią jest taka, że ​​Mozilla twierdzi, że Mobile Safari obsługuje 'window.crypto.getRandomValues' od iOS 6. Czy uważasz, że mają rację? W każdym razie, dzięki jeszcze raz - nie mogłem oczekiwać lepszej odpowiedzi! –

+0

Ah! Jest to całkowicie możliwe, tak. Nie mam urządzenia z systemem iOS 6 do przetestowania, ale zakładam, że mają rację, chyba że ktoś wie inaczej ... – bobince

+4

Będzie w IE11, może pod Window.msCrypto. – user239558

7

Dla bardziej kompletne, aktualne widzenia, to chyba lepiej po prostu sprawdzić caniuse.com:

http://caniuse.com/#feat=getrandomvalues

W grudniu 2015 roku, wszystkie nowoczesne przeglądarki, z wyjątkiem Opery Mini, wspierają go:

enter image description here

2

Cześć Po prostu miałem ten sam problem, wiem, że minęło trochę czasu, ale wciąż może to komuś pomóc. Opera jest jedynym, który nie obsługuje window.crypto.getRandomValues, ale jest to math.random() jest całkiem bezpieczne.

To, co zrobiłem, aby to rozwiązać, było po prostu sprawdzenie, czy okno .crypto jest dostępne, jeśli nie, to jest to przeglądarka operowa, a jeśli nie, to wyślij komunikat o błędzie, że przeglądarka nie może wygenerować bezpiecznego hasła.

if(window.crypto && window.crypto.getRandomValues) 
{ 
    (use window.crypto.getRandomValues) 
} 
else if(isOpera) 
{ 
    (use Math.random) 
} 
else throw new Error("Your browser can not generate a secure Password, please change it to one that can (Google Chrome, IE, Firefox, Safari, Opera) or get the newest update."); 

Nadzieja Pomaga komuś.

+0

Nice ale czy ten komunikat o błędzie jest pomocny? – zaph

+0

Możesz wybrać komunikat o błędzie, przeglądarka musi być naprawdę bardzo stara, aby wywołać ten błąd (jeśli nie chcesz pokazać tego błędu, jedyną rzeczą, którą mogę zrobić, to użyć prostej matematyki. losowy jako ostatni zasób – OmarAguinaga

+0

Punktem komunikatów o błędach jest pomocna Postaw się na miejscu użytkownika, czy jest pomocna? Co użytkownik chce, potrzebuje, wiedzieć, co robić, użyj innej przeglądarki lub po prostu daj w górę Mówisz użytkownikowi o błędzie przeglądarki, którego nie może nic zrobić. – zaph

0
const crypto = window.crypto || 
    window.msCrypto || { 
    getRandomValues: array => { 
     for (let i = 0, l = array.length; i < l; i++) { 
     array[i] = Math.floor(Math.random() * 256); 
     } 
     return array; 
    } 
    }; 

    if (crypto.getRandomValues === undefined) { 
    throw new Error("crypto is not supported on this browser"); 
    } 
+0

To nie odpowiada na pytanie, które zadałem .Zapytałem, czy 'window.crypto.getRandomValues' jest obsługiwane we wszystkich nowoczesnych przeglądarkach; fragment kodu nie jest odpowiedzią na to pytanie (osobno, niepokoi cię, że sugerujesz kod, który używa 'Math.random', ponieważ' Math.random' często nie jest bezpieczny do zastosowań kryptograficznych.) –

+0

Tak, aby odpowiedzieć Twoje pytanie, nie jest obsługiwane y wszystkie przeglądarki. dlatego opublikowałem to, ponieważ wróci do czegoś użytecznego. Zachęcamy do głosowania na dół. Pomyślał, że to było przydatne i jako alternatywa dla innych odpowiedzi –