Actualmente estoy desarrollando un complemento y es muy probable que lo publique en el repositorio de complementos públicos para que otros puedan usarlo.
El complemento usará una API y para usar esta API debe pasar un nombre de usuario y contraseña. Por lo tanto, mi complemento necesita almacenar estas credenciales de inicio de sesión en la base de datos. No quiero almacenarlos en texto sin formato, aunque la API los necesita en texto sin formato.
Entonces, mi pregunta es ¿cómo almaceno esta información confidencial? Hashing está fuera, por lo que tiene que ser algún tipo de cifrado.
En WordPress, ¿hay una clave única que se pueda usar que difiera de un blog a otro? ¿Qué funciones de php debo usar para cifrar y descifrar? Estoy buscando funciones que probablemente funcionen en todas las instalaciones de WP.
Respuestas:
Si bien estoy de acuerdo con las respuestas anteriores, para responder la pregunta que realmente hizo, lo que viene a la mente es utilizar una de estas constantes para wp-config.php:
Están destinados a ser únicos en todas las instalaciones de WordPress, y son casi las únicas opciones para las claves preexistentes que se encuentran en WordPress. Alternativo sería agregar su propia constante similar que se construye al mezclar una de ellas con la dirección de correo electrónico del administrador o similar, y luego almacenarla en una opción de configuración oculta, para proteger contra la pérdida de su clave si alguien modifica accidentalmente las claves después de su El complemento está instalado. El peligro es que si no se hicieron únicos en la instalación inicial, pero el administrador / propietario del sitio decide rectificar la falla después del hecho, no deberían romper accidentalmente el cifrado de su contraseña.
En cuanto a las funciones de cifrado / descifrado: una búsqueda rápida en Google devuelve la siguiente lista con el código que parece ajustarse a la factura: http://maxvergelli.wordpress.com/2010/02/17/easy-to-use-and-strong- cifrado-descifrado-funciones-php /
Aquí hay alguna documentación del cifrado AES utilizado aquí: http://www.chilkatsoft.com/p/php_aes.asp
fuente
Esta es exactamente la circunstancia para la que OAuth fue diseñada.
Desde la página de inicio de OAuth :
La ventaja de OAuth es que no necesita almacenar la contraseña del usuario. Cuando configuran el complemento por primera vez, se les pide que inicien sesión con un nombre de usuario y contraseña a través de la aplicación (generalmente una página alojada en el mismo servidor que la API y cargada en una redirección de página, un cuadro grueso o un iframe) .
Una vez que el usuario inicia sesión, el servidor (su sistema) crea una clave segura que su sistema (WordPress) puede usar para interactuar con la API. Esta clave es única para la cuenta de usuario y el sitio, y le da permiso a la aplicación (en WordPress) para hacer cosas con la API en nombre del usuario sin pasar su información de autenticación cada vez.
Si desea ver un ejemplo de esto en acción, consulte Jetpack .
Cuando activa el complemento, se queja de que no está conectado. Cuando lo "conecta", ingresa sus credenciales a través de WordPress.com y configura la interacción OAuth entre WordPress y su API.
Pero solo tiene que hacer esto una vez y su nombre de usuario / contraseña de WordPress.com nunca se almacena en su base de datos local de WordPress.
fuente
Este es un problema importante, ya que muchos servicios aún no son compatibles con OAuth y el almacenamiento de contraseñas en la base de datos de opciones los hace legibles para cada complemento de Wordpress (vea mi comentario más arriba).
Esta no es (todavía) una respuesta real a la pregunta, pero también es demasiado larga para un comentario. Espero iniciar una discusión con esto, con el objetivo de encontrar la "mejor" solución posible a este problema "irresoluble".
La idea básica que me hace pensar que es posible cifrar contraseñas es la siguiente:
Hay una pieza de información secreta que cada usuario tiene: su contraseña de Wordpress. Debería ser posible almacenar credenciales en servicios de terceros encriptados con un formulario secreto derivado de esa contraseña y solo descifrarlos cuando el usuario haya iniciado sesión.
De esta manera, debería ser posible al menos hacer que sea imposible robar las contraseñas de una copia de los archivos y la base de datos de Wordpress. No puede resolver el problema de que otros complementos roben credenciales, porque cada complemento puede capturar la contraseña de texto sin formato durante el inicio de sesión.
En realidad, el descifrado es bastante fácil de hacer: supongamos que ya tenemos una versión encriptada del servicio de terceros almacenada en la base de datos, podemos conectarla al
'authenticate'
filtro o al sobrescribir lawp_authenticate()
función, generar un hash salado de la contraseña de usuario de texto sin formato (por medios dewp_hash_password()
), almacene esa contraseña cifrada como clave de cifrado en algún lugar privado hasta que el usuario cierre sesión (use el'wp_logout'
gancho para eliminar la clave) y úsela cada vez que necesitemos la contraseña de un tercero para descifrar el valor cifrado en la base de datos.Si bien tengo la sensación de que debería ser posible hacer que esto funcione, sin embargo, hay varios problemas sin resolver:
'authenticate'
. Se le podría solicitar al usuario que inicie sesión para mantener el período hasta que esto ocurra brevemente.'authenticate'
solo se ejecuta cuando el usuario realmente inicia sesión?fuente