¿Cómo encripto y luego descifro el texto del nombre de usuario y la contraseña utilizados en el archivo de clase de la base de datos?

He creado un archivo de clase database.php que maneja todas las consultas sql y se conecta a la base de datos. Guardo el nombre de usuario y la contraseña para la base de datos en una variable (que se ve fácilmente si uno obtiene acceso al archivo php).

Quiero encriptar ese nombre de usuario y contraseña para que incluso después de tener ese archivo php uno no pueda tener una idea del nombre de usuario y la contraseña originales.

Por favor, ayúdenme ya que necesito una idea desesperadamente.

Gracias

Esto difícilmente se puede hacer. Necesita la contraseña en un formato descifrable para enviarla a la base de datos. Cualquier forma de este tipo será de alguna manera legible por una persona que obtenga acceso al archivo .php.

El enfoque de sentido común es mantener los archivos de configuración fuera de nuestro sistema como una medida de seguridad básica, y prevenir ataques externos asegurando adecuadamente el servidor. Cientos de miles de sitios web se ejecutan de esa manera, sin encriptar sus datos confidenciales de la manera que usted describe.

Odiaría romperlo por ti, pero si alguien tiene acceso a tus archivos fuente para tu sitio, ya se acabó el juego . Podrán insertar código en ellos para simplemente raspar los datos necesarios, o más probablemente obtener el código para instalar un troyano en las computadoras de sus visitantes. Lo mejor es que dedique el tiempo y el esfuerzo de ingeniería a bloquear sus servidores y máquinas de desarrollo para que el perpetrador no pueda entrar. También es necesario tener un buen plan de recuperación ante desastres.

Si alguien tiene acceso a su fuente, entonces tienen todos los medios necesarios para conectarse a la base de datos, independientemente de cómo almacene su contraseña. Después de todo, el intérprete de PHP finalmente necesita saber cuál es la contraseña real, y cualquiera que pueda ver la fuente puede hacer exactamente lo que haría el intérprete de PHP, y así adquirir la contraseña.

En cambio, debe encontrar una forma de controlar quién tiene acceso a su fuente.

Lamento haber malinterpretado la pregunta para comenzar …

Si está utilizando un nombre de usuario y contraseña para que su secuencia de comandos acceda a la base de datos, entonces obviamente necesita almacenar esto en algún lugar para comenzar (en su secuencia de comandos).

La única forma en que puedo pensar sería ofuscar la contraseña en tu fuente y hacer algunas manipulaciones para obtener el valor correcto. Pero esto simplemente parece excesivo, como si alguien tuviera acceso a la fuente, entonces es más que probable que puedan descifrar el rest.

EDITAR: ¿Por qué no almacenar el nombre de usuario / contraseña en un archivo local en el servidor, y luego solo dar acceso de lectura a PHP? Al menos de esa manera no se puede ver directamente en tu código fuente.

No hay forma de encriptar algo para que solo MySQL pueda descifrarlo. Necesita proporcionar a MySQL esa contraseña de texto sin formato tarde o temprano.

Idea
Establezca los permisos de archivo en database.php más bajo posible. Si tienes esto:

  rw-rw-r-- gaurav gaurav database.php 

Luego, puede establecerlo así (suponiendo que sus procesos php se ejecutan en www-data )

  r-------- www-data www-data database.php 

Supongo que está distribuyendo el código de alguna manera, o que no confía en su propio entorno host.

Existen formas de cifrar el origen PHP, pero tienen distintos niveles de complejidad y costo. Algunos requieren software adicional (descifrado) para ser instalado en el servidor host, que puede o no ser una opción que usted pueda tener.

Echa un vistazo a este artículo para obtener más información sobre una serie de herramientas de cifrado de PHP.

Si ( y solo si ) tu intención es dejar de mostrar el nombre de usuario + contraseña a las personas que tienen acceso a la fuente, podría hacerse. Sin embargo, no es demasiado conveniente y consta de estos pasos:

One-off:

  • ponga su nombre de usuario y contraseña en un archivo fuertemente encriptado (por ejemplo, AES con una clave larga y fuerte) y establezca sus permisos en consecuencia

En cada arranque:

  • al iniciar el servidor, descifrar el archivo, ingresar manualmente la contraseña del archivo y usar algún proceso de larga duración como almacenamiento temporal
  • ahora que tiene el nombre de usuario + contraseña almacenados en la memoria, borre la versión descifrada del archivo.

En tus guiones:

  • solicita el nombre de usuario + contraseña de tu almacenamiento temporal
  • conectarse a la base de datos
  • eliminar el nombre de usuario + pw de las variables de su script

Nota: todo esto significa que la contraseña no se puede recuperar mirando el código fuente. Aquellos que pueden modificar y ejecutar scripts en su servidor están en la misma posición que antes: “solicitar contraseña, imprimirla”, en lugar de simplemente “imprimirla”. Otra desventaja es que ahora debe ingresar la contraseña de descifrado en cada reinicio del servidor.

Al almacenar una contraseña, SIEMPRE usa el hashing unidireccional, preferiblemente SHA-256 (porque MD5 no es seguro) para almacenar la contraseña. Y cuando quiera comparar la contraseña, simplemente SHA-256 comprueba la contraseña intentada y comprueba si los hashes son los mismos.

Las contraseñas encriptadas simplemente no son seguras, si hay una manera de obtener la contraseña de texto sin formato del garble, su seguridad es defectuosa.

PD: Y sí, cualquier sitio web que pueda enviarle su contraseña por correo electrónico es defectuoso.