Un servicio web particular en el que estoy escribiendo interfaces con una API. Cada llamada a la API requiere que se envíen el nombre de usuario y la contraseña del usuario, no se mantiene ningún estado.
Idealmente, cuando use mi servicio web, el usuario ingresará su nombre de usuario y contraseña de API una vez, y mi servicio web almacenará esa información hasta que finalice la sesión. Entiendo que no debo almacenar la contraseña de la API utilizando sesiones de PHP ni en una base de datos debido a problemas de seguridad. Por lo tanto, ¿cómo puedo almacenar y acceder de forma segura a la contraseña durante la sesión?
¿Sería seguro cifrar la contraseña, almacenar la contraseña cifrada en una cookie y la clave de cifrado en una sesión?
Tenga en cuenta que originalmente hice la pregunta (sin la solución propuesta) en SO: enlace Si hubiera bebido café primero, habría sabido publicar aquí en lugar de allí. La publicación SO se puede eliminar, pero no yo.
La respuesta dada es la que ahora estoy usando en producción, por lo que si hay fallas en el enfoque (almacenar la contraseña encriptada en la sesión de PHP, la clave de encriptación en la cookie) me gustaría mucho saberlo.
$encryptionKey = sha1(microtime(true).mt_rand(PHP_INT_MAX / 10, PHP_INT_MAX));
$encryptedPassword = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryptionKey, $password, MCRYPT_MODE_CFB);
setcookie('atwood', $encryptionKey, 0);
$_SESSION['encryptedPassword'] = $encryptedPassword;
$password = mcrypt_decrypt(MCRYPT_BLOWFISH, $_COOKIE['atwood'], $_SESSION['encryptedPassword'], MCRYPT_MODE_CFB);