password_hash password metodos encriptar encriptadas encriptacion ejemplo contraseñas contraseña php passwords storage

password - metodos de encriptacion php



Almacenar contraseñas en forma reversible (12)

Tengo una aplicación PHP que necesita ejecutar scripts bash y proporciona un nombre de usuario y contraseña (para sistemas remotos). Necesito almacenar estas credenciales en algún lugar al que pueda acceder mi aplicación PHP (web). El lugar lógico es la base de datos (actualmente MySQL, pero será agnóstico). El problema con la forma "estándar" de hash y almacenamiento de las credenciales es que no es reversible. Tengo que poder obtener las credenciales como texto sin cifrar, para poder insertar los datos en los scripts bash.

¿Alguien tiene alguna sugerencia para una forma segura de hacerlo?

Pensé que quizás PKI''ing las credenciales, y almacenar el resultado en el DB. Luego use la clave privada para desencriptar (PHP puede hacer eso). Almacene los scripts para hacer esto fuera de la raíz web.

Cualquier pensamiento muy apreciado.


Como muchos declararon, su escenario requiere que encripte el nombre de usuario y la contraseña. Te recomendaría que revises la extensión mcrypt de php para cifrado / descifrado.


Creo que estás en el objetivo. Mira GPG para una buena biblioteca de cifrado abierta


Parece que tienes dos métodos para hacer esto:

1) Al igual que sugirió utilizar un algoritmo de encriptación o algoritmos que luego pueden ser descifrados y utilizados para la autenticación en sus scripts. Puede usar la biblioteca MCrypt en PHP para lograr esto.

2) Dependiendo del nivel de seguridad requerido y el nivel de vulnerabilidad de su secuencia de comandos, podría usar un hash seguro, clave o algún otro identificador único difícil de adivinar que pueda utilizar para secuestrar la cuenta de cada usuario dentro de los límites del script.


Si vas a la PKI, y yo lo haría, ¡asegúrate de proteger tus llaves privadas! El fuerte cifrado proporcionado por PKI es tan seguro como sus claves.


Sugeriría que no almacene las contraseñas, pero use la conexión ssh sin contraseña del host al sistema remoto generando una clave ssh y almacenando su clave pública en el archivo authorized_keys del sistema remoto. Entonces solo necesitarías establecer conectividad durante la configuración. Es cierto que no estoy respondiendo tu pregunta, pero almacenar contraseñas en una forma reversible es una pendiente resbaladiza a una brecha en la seguridad, aunque estoy seguro de que cerebros más inteligentes que los míos pueden hacerlo seguro.


Tendrá que buscar buenos métodos criptográficos de 2 vías, y mi regla general es:

Si implementa su propio código criptográfico, fallará.

Por lo tanto, busque una buena implementación que esté bien verificada y utilícela.

Probablemente hay alguna buena información aquí:

http://phpsec.org/library/


Una manera fácil de comenzar es usar las funciones ENCODE () y DECODE () de mysql. No sé qué algoritmo se usa debajo, pero es bastante fácil de usar:

INSERT INTO tbl_passwords SET encoded_pw = ENCODE(''r00t'', ''my-salt-string'');

y

SELECT DECODE(encoded_pw, ''my-salt-string'') FROM tbl_passwords;


Verifique esta biblioteca: PECL gnupg le proporciona métodos para interactuar con gnupg. Puede cifrar y descifrar datos fácilmente, utilizando algoritmos criptográficos seguros de clave pública.


Creo que voy a investigar la compilación de un script PHP con las credenciales integradas, sobre la marcha, desde la aplicación web.

Pediría las credenciales (para un uso dado), luego crearía y compilaría un nuevo script PHP, solo para este uso. De esa forma, el script solo hará lo que necesito y no debe ser "legible". Creo que esto parece ser la forma más segura de hacer esto.

Intentaremos usar Roadsend. http://www.roadsend.com/


Solo para dar seguimiento a la sugerencia de utilizar las funciones de codificación y decodificación de MySQL, el manual es vago sobre cómo funcionan:

La fuerza del cifrado se basa en qué tan bueno es el generador aleatorio. Debería ser suficiente para cadenas cortas.

Pero lo que sugeriría es que en su lugar puede usar las funciones integradas de MySQL 5.0 AES ; AES_ENCRYPT() y AES_DECRYPT()

SELECT AES_ENCRYPT(''secret squirrel'', ''12345678'') AS encoded => ØA;J×ÍfOU»] É8 SELECT AES_DECRYPT(''ØA;J×ÍfOU»] É8'', ''12345678'') AS decoded => secret squirrel

Estos usan AES de 128 bits que deberían ser lo suficientemente fuertes para la mayoría de los propósitos. Como otros comentaron, usar una sal y una clave con una alta entropía es una buena práctica.


Para PHP, es importante tener en cuenta que el cifrado AES se implementa mediante las funciones MCRYPT_RIJNDAEL. No vaya a pagar por una implementación no abierta cuando PHP los tenga disponibles.

Consulte la página de PHP sobre las cifras disponibles para obtener más información.


En primer lugar, para indicar el (con suerte) obvio, si puede de ninguna manera evitar el almacenamiento de nombres de usuario y contraseñas; es una gran responsabilidad y si se infringe su tienda de credenciales, puede proporcionar acceso a muchos otros lugares para los mismos usuarios (debido al uso compartido de contraseñas).

En segundo lugar, si debe almacenar las credenciales, prefiera las contraseñas almacenadas utilizando un hash criptográfico no reversible y salado, de modo que si los datos se ven comprometidos, las contraseñas no se pueden modificar de forma inversa y no es necesario almacenar una clave de descifrado.

Si debe almacenar credenciales descifrables:

  1. Elija un buen algoritmo de cifrado: AES-256, 3DES (anticuado) o un cifrado de clave pública (aunque creo que no es necesario para este uso). Utilice el software criptográfico de una fuente de confianza de buena reputación. NO INTENTE RODAR SU PROPIO, ES PROBABLE QUE LO HAGA EQUIVOCADO.
  2. Use un generador aleatorio seguro para generar sus llaves. La aleatoriedad débil es la causa principal de las fallas de seguridad relacionadas con el cifrado, no de los algoritmos de cifrado.
  3. Almacene las claves de cifrado / descifrado por separado de su base de datos, en un archivo seguro de O / S, accesible solo para el perfil de tiempo de ejecución de las aplicaciones. De esta forma, si su base de datos se infringe (por ejemplo, mediante inyección SQL), su clave no es automáticamente vulnerable, ya que eso requeriría acceso al HDD en general. Si su O / S es compatible con el cifrado de archivos vinculado a un perfil, úselo: solo puede ayudar y, en general, es transparente (por ejemplo, cifrado NTFS).
  4. Si es práctico, almacene las claves encriptadas con una contraseña primaria. Esto generalmente significa su aplicación. necesitará la contraseña introducida al inicio; no es bueno proporcionarla en un parámetro de una secuencia de comandos, ya que si se rompe su HDD, debe suponer que se pueden ver tanto el archivo de la clave como la secuencia de comandos.
  5. Para cada conjunto de credenciales, almacene un sal (no encriptado) junto con los datos encriptados; esto se usa para "cebar" el cifrado de modo que dos contraseñas idénticas no produzcan el mismo texto de cifrado, ya que eso revela que las contraseñas son las mismas.
  6. Si el nombre de usuario no es necesario para ubicar el registro de la cuenta (que en su caso no es), cifre tanto el nombre de usuario como la contraseña. Si encriptas ambas, las encriptas como una ejecución de cifrado, por ej.

    userAndPass = (usuario + ":" + pase);
    encryptInit ();
    encriptar (sal);
    encriptar (userAndPass);
    cipherText = encryptFinal ();

    y almacene el blob singular, para que haya menos aparición de textos de cifrado cortos, que son más fáciles de romper, y el nombre de usuario salda la contraseña.

PD: No programo en PHP, así que no puedo comentar criptografía s / w adecuada en ese entorno.