seguridad basada en la web de KeePass

1

Estoy considerando crear una solución similar a KeePass basada en la web en Symfony 3 (PHP) para tener la contraseña segura con algunas otras funcionalidades agregadas. Quiero asegurarme de que no haya fallas de seguridad importantes. Aquí están los supuestos:

  1. Servidor interno de la empresa, servicio interno
  2. El sitio web funciona solo en HTTPS
  3. El usuario primero debe iniciar sesión (LDAP, la política de contraseña de la empresa es bastante estricta)
  4. Después de iniciar sesión, el usuario debe ingresar la contraseña de encriptación que se usará como clave de encriptación luego de ser procesada con SHA256 (hash ('sha256', $ key, true))
  5. La contraseña de cifrado ingresada se verifica si es válida comparando un solo valor descifrado con un valor esperado conocido
  6. Métodos de cifrado / descifrado, utilizados para mantener / recuperar contraseñas de la base de datos:

    public function encrypt($openText) {
        $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
        $iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
    
        $encryptedPayload = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->keyHash, $openText, MCRYPT_MODE_CBC, $iv);
    
        $encryptedBinary = $iv . $encryptedPayload;
    
        return $encryptedBinary;
    }
    
    public function decrypt($encryptedBinary) {
        $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
        $iv = substr($encryptedBinary, 0, $ivSize);
    
        $encryptedPayload = substr($encryptedBinary, $ivSize);
    
        $openText = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->keyHash, $encryptedPayload, MCRYPT_MODE_CBC, $iv), "\x00");
    
        return $openText;
    }
    
  7. El hash de la clave de cifrado se mantiene en la sesión del usuario

  8. La sesión del usuario caduca a los 120 segundos desde la última actividad
  9. Las contraseñas no se guardan en el sitio web HTML, se leen desde el servidor cada vez que usan AJAX sobre HTTPS, se colocan temporalmente en el atributo del elemento HTML para que JS las copie, y luego el atributo se elimina
  10. Las contraseñas se copian al portapapeles usando clipboard.js
  11. El portapapeles se borra (copiando una cadena vacía) después de 15 segundos

¿Ve algún problema de seguridad aquí (considerando el diseño de la aplicación web, en comparación con KeePass)? ¿A qué debería prestarme especial atención?

    
pregunta FoxException 23.08.2016 - 14:38
fuente

2 respuestas

4

Muchos problemas potenciales aquí.

Primero, estás usando PHP, y es difícil hacer las cosas correctamente (como evitar la inyección de SQL, cifrar de forma segura, etc.) en PHP. No es imposible, de ninguna manera, pero es irrazonablemente difícil.

En segundo lugar, como señaló un comentarista, hashea una contraseña con SHA256 para generar la clave. Esto es malo. Utilice un PBKDF adecuado, como bcrypt.

Tercero, estás usando la versión de tamaño de bloque de 256 bytes de Rijndael, que es simplemente impar. No, como muchos otros lo han hecho antes, confunda esto con AES-256.

Cuarto, no cifre los datos directamente con la clave derivada. Cifrelo con una clave de cifrado de datos que se genere de manera segura y aleatoria, y que a su vez esté protegida con la clave derivada de la contraseña del usuario. De esta manera, el usuario puede cambiar su contraseña de cifrado maestra sin tener que descifrar todas sus contraseñas de forma sincrónica con la clave antigua, y volver a cifrarlas con la clave nueva. Solo necesita volver a cifrar la clave de cifrado de datos con la clave de cifrado de clave.

Quinto, registro, tasa limitada, IDS. Necesitas tener un sistema en su lugar para amortiguar los ataques, y que te avise cuándo están sucediendo.

Eso es suficiente por ahora. Estoy seguro de que hay muchos más escollos ... Esto es solo una lista de mi mirada inicial. Le recomendaría encarecidamente que abandone este proyecto por completo y busque una solución existente, razonablemente bien probada, como 1Password for Teams, o algo similar. Construir un sistema como este está lleno de peligros, y el ejemplo de código que me proporcionó me indica que es probable que aún no tenga los conocimientos necesarios para lograrlo con un nivel razonable de confianza en su seguridad. Y eso no es un golpe contra usted ... Estos son sistemas increíblemente difíciles de construir de manera segura, y alguien que intente hacerlo por primera vez sin una guía más allá de lo que Internet puede proporcionar, no lo hará.

    
respondido por el Xander 23.08.2016 - 17:43
fuente
1

Te falta una revisión de código. Keepass es de código abierto y ha sido revisado de forma independiente.

Incluso si el diseño es correcto, obtener la implementación correcta es extremadamente difícil.

Considere el costo de una auditoría.

    
respondido por el Nate 23.08.2016 - 16:47
fuente

Lea otras preguntas en las etiquetas