Seguridad del generador de contraseñas de LastPass

15

Actualmente uso LastPass para toda la generación y administración de mi contraseña. Después de leer Diceware , me di cuenta de que el generador de contraseñas de LastPass podría ser inseguro, ya que alguien podría potencialmente intentar generar el La misma contraseña que hice.

Soy cauteloso al publicar su código en este sitio web, pero al inspeccionar su código aquí , lo he visto por En cada carácter, seleccionan un tipo de carácter (Superior, Inferior, Número, Símbolo o Todo) y luego seleccionan un carácter aleatorio de una lista predefinida.

He intentado ver su código de generación de números aleatorios, y parece que usan el tiempo como semilla. No estoy completamente seguro de de dónde viene rng_pool y cómo funciona para generar la contraseña.

¿Qué método de generación utilizan? ¿Es seguro?

(Las funciones importantes en la página son lpCreatePass y getRandom )

    
pregunta Nathan Merrill 03.01.2015 - 16:47
fuente

1 respuesta

16

Si parece sembrar el RNG con window.crypto , que si no está disponible window.msCrypto se usa y finalmente cae volver a la hora actual. El código relevante es:

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 es parte de API de criptografía web :

  

[La especificación de la API de criptografía web] describe una API de JavaScript para realizar operaciones criptográficas básicas en aplicaciones web, como hash, generación y verificación de firmas, y cifrado y descifrado. Además, describe una API para que las aplicaciones generen y / o administren el material de claves necesario para realizar estas operaciones. Los usos de este API van desde la autenticación de usuarios o servicios, la firma de documentos o códigos, y la confidencialidad e integridad de las comunicaciones.

window.msCrypto es la implementación de Microsoft de esto.

Si está utilizando un navegador compatible, este método de generación parece seguro (también es tan seguro como la implementación de la API de criptografía web de su navegador). De lo contrario, parece que usa Math.random sembrado con la hora actual, lo cual no es seguro. Sería bueno que la página web le advirtiera si este fuera el caso.

Esta página muestra el estado actual de la compatibilidad del navegador para la API de criptografía web .

    
respondido por el SilverlightFox 04.01.2015 - 14:06
fuente

Lea otras preguntas en las etiquetas