2010-03-31 29 views
8

Estoy haciendo una aplicación en PHP y existe el requisito de que debe ser posible descifrar las contraseñas para evitar problemas en el futuro con el cambio de la base de datos de usuario a un sistema diferente. Considere que no es posible modificar el método de contraseña de este sistema futuro y necesito contraseñas de texto sin formato para que se generen las contraseñas.Manera segura de almacenar contraseñas descifrables

El plan es cifrar la contraseña del usuario con una clave pública que se almacena en el servidor. La autenticación se realiza encriptando la entrada y comparando los resultados. NO hay descifrado hecho. La clave privada capaz de descifrado se almacena fuera del sitio para su uso posterior.

¿Qué algoritmo de cifrado/descifrado sugeriría? ¿Las contraseñas encriptadas siguen siendo tan seguras como el hashing (MD5/SHA1) cuando considera que la clave privada no está disponible para el atacante?

+7

MD5 y SHA1 no son cifrados, sino hash. ¿Estás hablando de cifrado o hash aquí? –

+0

¿De qué tipo de "clave privada" hablas en el contexto de hash? ¿Quiso decir GPG/PGP? – erenon

+0

¿Por qué usar un hash tendría un efecto adverso al cambiar a un sistema diferente? – LizB

Respuesta

2

Ser capaz de descifrar las contraseñas es una mala idea (y probablemente no haya ninguna forma de hacerlo que sería mucho mejor que almacenarlas sin encriptar). Parece que su principal problema es poder usar las contraseñas si cambia su método de almacenamiento. Simplemente haz lo que hace Linux, almacena cómo has hashing la contraseña con la contraseña. Entonces, por ejemplo, $ 1 $ salt $ hash es MD5. De esta manera, si decide cambiar la forma en que se almacenan las contraseñas, puede verificar las contraseñas antiguas (y si alguien inicia sesión correctamente, puede actualizar su contraseña con el nuevo hash).

+0

Esto me requeriría modificar la plataforma futura, lo cual prefiero no hacer. De acuerdo, requerirá un poco de esfuerzo mover las contraseñas simples allí también, pero al menos no requerirá ningún esfuerzo administrativo después del movimiento de una sola vez. – Jammer

+0

¿No podría usar algo que sabe que será compatible en el futuro? Por ejemplo, SHA512 es fácil de usar en casi cualquier plataforma (si puedes encontrar una biblioteca para hacer encriptación, probablemente también puedas usar sha512). –

+1

Acepto, no debe sacrificar la seguridad solo para facilitar el cambio al * siguiente * método de encriptación. Simplemente comience con uno bueno al principio y no tendrá que preocuparse por ningún cambio futuro. – poke

0

Para la mayoría de las aplicaciones, es más que suficiente almacenar contraseñas de contraseñas SHA-1.

Sí, hay colisiones conocidas en la mayoría de los algoritmos hash, pero eso no implica un vector de ataque real. Especialmente cuando salan los hashes.

Para su sal: almacénelo en un archivo de configuración que no se puede acceder desde el exterior, pero puede ser leído por su instalación de PHP.

+0

-1 Lo que está proponiendo es una vulnerabilidad reconocida. Te veré en BugTraq. – rook

+0

Estoy buscando solución de cifrado, no hash. – Jammer

+1

Almacenar una sola sal es solo un poco mejor que no usar una, usar una sal para cada contraseña es una mejor idea. –

4

No descifrar la contraseña. Si necesita cambiar el sistema de contraseñas en el futuro, agregue un campo denominado tipo de almacenamiento (o lo que sea).

Luego, cuando necesite cambiar las contraseñas, comprobará si se trata de una contraseña anterior. Si es así, la próxima vez que inicien sesión, puede cambiar la codificación de la contraseña. De lo contrario, inicie sesión con el nuevo sistema.

8

Voy a reformular el enfoque de Jammer -

  1. Generar un par de claves pública/privada. Hard-code la clave pública en su servidor web. Almacene la clave privada en un casillero de banco físico, fuera del alcance del servidor web/base de datos/cualquier desarrollador.
  2. Cuando el usuario se registra, cifra la contraseña + sal usando la clave pública. Este paso es idéntico al uso de un algoritmo hash. Almacene la contraseña + sal cifrada en la base de datos.
  3. Cuando desee verificar la contraseña, vuelva a encriptarla y compárela con el valor almacenado en la base de datos.

Si un atacante obtiene la base de datos, no puede descifrar las contraseñas porque no tiene la clave privada. No puede obtener la clave privada porque está en una bóveda bancaria fuera de su alcance. Dos contraseñas idénticas se almacenarán de manera diferente en la base de datos debido a la sal.

No recomiendo usar el enfoque anterior porque en cualquier momento en el futuro alguien podría abusar de la clave privada y obtener acceso a todas las contraseñas.

Pero si usted garantiza que la clave privada siempre permanecerá privada, entonces no veo un error técnico.

Podría estar equivocado, por supuesto.

+0

También es bastante caro en términos de procesamiento en comparación con solo hash la contraseña. – symcbean

+0

@Sripathi Correcto, pero ¿qué algoritmo debería usar? – Jammer

+1

@symcbean podría ser más caro, pero reconozco que esto no será un problema. Además, cualquier atacante tendrá que pasar mucho más tiempo al realizar ataques de diccionario contra la base de datos. – Jammer

1

El único problema que veo es que la mayoría del código de cifrado de clave pública-privada cifrará una clave simétrica utilizando la clave pública, y confía en la clave privada descifrando eso, luego usa la clave simétrica para encriptar el mensaje.

Desea utilizar la clave pública para encriptar directamente la contraseña + sal.

Así ataques contra su sistema se reducen a:

  1. ataques contra público en general/cifrado de clave privada
  2. ataques contra su almacén de claves privadas.
Cuestiones relacionadas