Estoy diseñando una API en PHP / MySQL que, por su diseño, no almacenará la contraseña de un usuario en la base de datos y, por lo tanto, no genera tokens de autorización para que el cliente los tenga. La razón de esto es para evitar cualquier posibilidad de obtener información confidencial y sin cifrar en el caso de un compromiso de la base de datos.
Los datos confidenciales del usuario se cifran con su propia contraseña, de modo que el descifrado de los datos no se puede realizar con nada almacenado en la base de datos (potencialmente comprometida). He implementado algunas funciones de seguridad actualmente:
- Como se describió anteriormente, los datos confidenciales se cifran utilizando AES utilizando la contraseña hash SHA-512 del usuario (la contraseña se proporciona con cada solicitud como datos del formulario), más un poco de sal.
- Se requiere HTTPS y solo se permiten las solicitudes POST.
- Las cuentas de usuario se identifican mediante direcciones de correo electrónico (recortadas y en minúsculas en el almacenamiento) y requieren verificación antes de su uso.
- Se requiere que las contraseñas de los usuarios tengan un mínimo de 8 caracteres.
- Finalmente, se requerirá un token de API para el uso de aplicaciones de terceros a través del encabezado de Autorización. Las aplicaciones de terceros están restringidas porque no pueden crear, verificar ni eliminar cuentas.
Mi pregunta es, ¿es esto suficiente? Apenas soy un experto en seguridad y lo último que quiero hacer es diseñar algo con una supervisión importante. Mi principal preocupación es que la contraseña del usuario se proporciona con cada solicitud, aunque solo sea a través de SSL.
Editar:
Para aclarar, los usuarios podrán cambiar sus contraseñas siempre que aún tengan la actual. Se realiza una solicitud que contiene la dirección de correo electrónico del usuario, la contraseña actual y la nueva contraseña. La solicitud se autentica como lo hace normalmente, utilizando la dirección de correo electrónico y la contraseña actual. La validación se realiza en la nueva contraseña (también se aplica el mínimo de 8 caracteres) antes de continuar.
Primero, tal como se hace cuando el usuario desea recuperar su información confidencial, la información se descifra con su contraseña actual. En su estado de descifrado, la información se encripta con la nueva contraseña y los datos confidenciales se sobrescriben en la base de datos.
En este punto, no hay un registro almacenado de la contraseña anterior y ya no se puede utilizar. Un administrador no puede realizar un cambio de contraseña o, en cualquier caso, sin la contraseña que se utilizó para cifrar la información anteriormente. Si se pierde la contraseña, no se puede hacer nada.