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:
- Servidor interno de la empresa, servicio interno
- El sitio web funciona solo en HTTPS
- El usuario primero debe iniciar sesión (LDAP, la política de contraseña de la empresa es bastante estricta)
- 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))
- La contraseña de cifrado ingresada se verifica si es válida comparando un solo valor descifrado con un valor esperado conocido
-
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; }
-
El hash de la clave de cifrado se mantiene en la sesión del usuario - La sesión del usuario caduca a los 120 segundos desde la última actividad
- 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
- Las contraseñas se copian al portapapeles usando clipboard.js
- 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?