Generatore di password di sicurezza di LastPass '

15

Attualmente utilizzo LastPass per tutta la mia generazione e gestione della password. Dopo aver letto Diceware , mi sono reso conto che il generatore di password di LastPass potrebbe essere insicuro, poiché qualcuno potrebbe potenzialmente tentare di generare il stessa password che ho fatto.

Sono cauto nel pubblicare il loro codice su questo sito Web, ma dall'ispezione del loro codice qui , l'ho visto per ogni carattere, scelgono un tipo di carattere (Superiore, Inferiore, Numero, Simbolo o Tutti), quindi scelgono un carattere casuale da un elenco predefinito.

Ho tentato di esaminare il loro codice di generazione di numeri casuali e sembra che utilizzino il tempo come seme. Non sono del tutto sicuro da dove provenga rng_pool e come funziona a generare la password.

Quale metodo di generazione stanno utilizzando ed è sicuro?

(Le funzioni importanti della pagina sono lpCreatePass e getRandom )

    
posta Nathan Merrill 03.01.2015 - 16:47
fonte

1 risposta

15

Se sembra seminare il RNG con window.crypto , che se non disponibile window.msCrypto viene utilizzato e cade infine ritorno all'ora corrente. Il codice rilevante è:

var rng_state;
var rng_pool;
var rng_pptr;


// Mix in a 32-bit integer into the pool
function rng_seed_int(x) {
  rng_pool[rng_pptr++] ^= x & 255;
  rng_pool[rng_pptr++] ^= (x >> 8) & 255;
  rng_pool[rng_pptr++] ^= (x >> 16) & 255;
  rng_pool[rng_pptr++] ^= (x >> 24) & 255;
  if(rng_pptr >= rng_psize) rng_pptr -= rng_psize;
}

// Mix in the current time (w/milliseconds) into the pool
function rng_seed_time() {
  rng_seed_int(new Date().getTime());
}

// Initialize the pool with junk if needed.
if(rng_pool == null) {
  rng_pool = new Array();
  rng_pptr = 0;
  var t;
  if(typeof(navigator) != 'undefined' && navigator.appName == "Netscape" && navigator.appVersion < "5" && typeof(window) != 'undefined' && window.crypto) {
    // Extract entropy (256 bits) from NS4 RNG if available
    var z = window.crypto.random(32);
    for(t = 0; t < z.length; ++t)
      rng_pool[rng_pptr++] = z.charCodeAt(t) & 255;
  }  

  //First try to use browser's PRNG over Math.random
  try{
    var crypt_obj = null;
    if (typeof(window) != "undefined" && typeof(window.crypto) != "undefined") {
      crypt_obj = window.crypto;
    } else if (typeof(window) != "undefined" && typeof(window.msCrypto) != "undefined") {
      crypt_obj = window.msCrypto;
    }



 if(typeof(crypt_obj) != 'undefined' && typeof(crypt_obj.getRandomValues) == 'function') {
      if(rng_pptr < rng_psize){
        var num = Math.floor((rng_psize - rng_pptr) / 2) + 1;
        var buf = new Uint16Array(num);
        crypt_obj.getRandomValues(buf);
        for(var i = 0; i < buf.length; i++){
          var t = buf[i];
          rng_pool[rng_pptr++] = t >>> 8;
          rng_pool[rng_pptr++] = t & 255;
        }
      }
    }
  }catch(e){}

  //Fall back to Math.random if needed
  while(rng_pptr < rng_psize) {  // extract some randomness from Math.random()
    t = Math.floor(65536 * Math.random());
    rng_pool[rng_pptr++] = t >>> 8;
    rng_pool[rng_pptr++] = t & 255;
  }
  rng_pptr = 0;
  rng_seed_time();
  //rng_seed_int(window.screenX);
  //rng_seed_int(window.screenY);
}

Window.crpto fa parte della API di crittografia Web :

[The Web Cryptography API] specification describes a JavaScript API for performing basic cryptographic operations in web applications, such as hashing, signature generation and verification, and encryption and decryption. Additionally, it describes an API for applications to generate and/or manage the keying material necessary to perform these operations. Uses for this API range from user or service authentication, document or code signing, and the confidentiality and integrity of communications.

window.msCrypto è l'implementazione di Microsoft di questo.

Se si utilizza un browser supportato, questo metodo di generazione appare sicuro (oltre che sicuro dell'applicazione del Web Cryptography API). In caso contrario, sembra che utilizzi Math.random seeded con l'ora corrente che non è sicuro: sarebbe bello se la pagina Web ti avvisasse in questo caso.

Questa pagina mostra lo stato corrente del supporto del browser per l'API di crittografia Web .

    
risposta data 04.01.2015 - 14:06
fonte

Leggi altre domande sui tag