2010-12-20 15 views
8

Estoy tratando de almacenar algunos datos bastante confidenciales utilizando PHP y MySQL y utilizaré alguna forma de encriptación reversible para hacerlo, ya que necesito recuperar los datos en texto sin formato para que sean de alguna utilidad.Encriptación/descifrado con dos teclas?

Voy a derivar la clave de cifrado de la combinación de nombre de usuario/contraseña de los usuarios, pero estoy perplejo de qué hacer en el caso (inevitable) de que se olvide una contraseña. Me doy cuenta de que el propósito del cifrado es que solo se puede deshacer usando la clave correcta, pero esto debe haberse tratado antes ...

Estoy tratando de entender si la criptografía de clave pública se aplicaría o no a la problema, pero todo lo que puedo pensar es que la clave privada todavía tendrá que ser correcta para descifrar los datos ..

¿Alguna idea?

Respuesta

3

Busco para almacenar algunos bastante datos sensibles utilizando PHP y MySQL y va a utilizar algún tipo de cifrado reversible de hacerlo, ya que necesito recuperar los datos en texto plano para es de alguna utilidad.

La protección de datos confidenciales es buena. Ahora:

  • ¿De quién es la información? (¿el suyo, el de su usuario o un tercero?)
  • ¿De qué se debe proteger? (Divulgación, la corrupción (accidental o intencional ...)
  • quién no lo necesitan ser protegidos de
    • partes que no están involucrados ni que decir.
    • ¿Necesita/desea evitar el acceso a los datos de texto usted mismo (útil de negación),
    • hacer lo necesario para proteger los datos, ya sea de su usuario sea visible a un tercero,
    • o los datos de un tercero por parte del usuario,
    • o sus datos desde el usuario o un tercero?
  • ¿Qué son los posibles ataques?
    • ¿Necesita proteger en el caso de que el servidor esté completamente comprometido?
    • ¿Necesita protegerse contra un ataque a nivel de aplicación donde el usuario simplemente obtiene acceso a algunos pero no a todos los datos disponibles (por ejemplo, acceso a la base de datos SQL, pero no al sistema de archivos)?
    • ¿La cantidad de datos será lo suficientemente pequeña para que el atacante adivine y simplemente verifique si la acertó? (las contraseñas cortas, los números, las palabras simples, el texto de la forma fija son los posibles candidatos)
    • ¿El atacante tendrá texto plano conocido para atacar?
  • ¿Es mejor que los datos desaparezcan (o recuperar los datos) si el usuario olvida su contraseña, o vale la pena un mayor riesgo de exponer los datos para evitar ese costo?

Probablemente haya otras preguntas, pero este es el tipo de cosas en las que quiere pensar al usar el cifrado. Las respuestas te ayudarán a descubrir lo que necesitas frente a lo que deseas, y probablemente te ayudarán a apuntar en la dirección correcta. Es posible que no desee compartir todas las respuestas con nosotros.

voy a derivar la clave de cifrado de los usuarios nombre de usuario/contraseña combinación, pero estoy confundido por lo que hacer en el evento (inevitable) de una contraseña ser olvidado. Soy consciente de que el propósito de cifrado es que que sólo se puede deshacer el uso de la clave correcta pero esto debe haber sido dirigida antes ..

Es posible que haya decidido sobre una solución sin tener en cuenta el impacto. Eso no significa que la solución sea incorrecta, pero esta pregunta sugiere que debe pensar en lo que está dispuesto a arriesgar por seguridad. A veces los datos se arriesgan.

que estoy tratando de conseguir mi cabeza alrededor de si o no la criptografía de clave pública se aplicaría al problema, pero todo lo ocurre es que la clave privada todavía tendrá que ser correcta para descifrar los datos ..

Esto también suena como una solución en busca de un problema. La criptografía de clave pública es útil cuando tiene dos (o más) actores separados con interés en comunicar datos entre ellos. Esos actores pueden ser reales (personas) o funcionales (componentes de un sistema), pero sin dos actores, no hay razón para tener una clave pública y privada separada.

1

¿Por qué usa una clave diferente para cada usuario?

Si elige una tecla, es mucho más fácil de manejar.

Almacene su clave de cifrado fuera de la base de datos.

Su aplicación todavía tendrá que tener acceso a ella, pero alguien con un volcado de base de datos no podrá leer la información cifrada.

+2

Si alguien termina con un volcado de base de datos, supongo que también podría obtener el código fuente de la aplicación – Matthew

5

No está claro lo que está buscando, por lo que es difícil obtener consejos sobre cómo implementarlo.

Los estándares como PGP y S/MIME encriptan cada mensaje con una nueva clave simétrica. Esas claves se cifran para cada destinatario del mensaje. De esta forma, en lugar de duplicar el mensaje (que podría ser muy grande) para cada destinatario, todos obtienen el mismo texto cifrado, y solo la clave (que es pequeña) se duplica — pero se cifra de manera diferente para cada destinatario.

Quizás podría hacer algo similar aquí, cifrar la clave con la contraseña del usuario y encriptar otra copia con su clave pública. Si el usuario olvida su contraseña, puede recuperar el mensaje para ellos (después de una verificación de identidad de copia de seguridad apropiada) utilizando su clave privada.

4

La solución convencional es tener un "agente de recuperación ": un usuario que tiene una segunda contraseña que se puede utilizar para descifrar todos los datos. Se aplicarían políticas de uso estrictas al uso de la contraseña de recuperación, como ponerla físicamente en una caja fuerte.

Luego, encripte todos los datos dos veces: una vez con la clave de usuario y otra con la clave de recuperación; como alternativa, genere una clave de sesión para cada conjunto de datos y encripte los datos solo una vez, pero la clave de sesión dos veces.

Para que funcione, al menos la clave del agente de recuperación debe ser asimétrica, ya que la parte privada vivirá en la caja fuerte y la clave pública en el software.

Como una alternativa más con el mismo esquema: encripte las contraseñas del usuario con la clave de recuperación al cambiar la contraseña. Esto es más fácil de implementar, pero permitirá recuperar las contraseñas y no solo los datos, lo que puede ser indeseable.

+0

Si desea más detalles sobre cómo implementar esto, busque los detalles técnicos de cómo EFS funciona en Windows. Puede ser tan complicado como otorgarle a diferentes fideicomisarios la capacidad de ver diferentes cantidades de datos, pero eso significa administrar más claves, o tan simple como tener la misma clave encriptada dos veces con diferentes claves públicas. – SilverbackNet

2

Básicamente, si encriptas algo y pierdes la clave de encriptación, estás jodido.

Cuando se trata de proteger los datos, debe tener en cuenta qué está asegurando, y lo que está tratando de asegurarla contra. Y qué compensaciones vale la pena hacer para lograrlo: el único sistema verdaderamente seguro es uno que está completamente aislado de Internet, que es un nivel de seguridad que es contraproducente para la mayoría de las aplicaciones.

Así que aquí hay algunas preguntas que debe hacerse:

  1. Si alguien pone en peligro mi base de datos, ¿es aceptable para ellos ser capaces de acceder a estos datos?
  2. ¿Qué pasa si alguien pone en peligro toda mi pila de aplicaciones?

Si las respuestas a las dos preguntas anteriores son "no", entonces el material clave debe ser retenido por el usuario. Y perderán el acceso a sus datos si pierden la clave.

le puede proporcionar una opción para manual de recuperación de claves si también tiene una "llave maestra" que no almacenar en cualquier lugar cerca de su aplicación, sólo se lo sostiene y lo utiliza para restablecer manualmente las contraseñas. Si eso tampoco es una opción (digamos, solo el usuario debe poder acceder a los datos, no al administrador del sistema), entonces tendrá que hacer un compromiso en alguna parte.

1
  1. Generar una clave de sesión aleatoria.
  2. Use la clave de sesión para encriptar los datos.
  3. Encripte la clave aleatoria con cualquier número de contraseñas de usuario que necesite.

De esta manera puede utilizar cualquier contraseña de usuario para descifrar los datos.

2

Esta es una pregunta que he pensado en mí mismo y en mi opinión son los siguientes opciones disponibles (con la opción # 1 es el más seguro):

  1. no proporcionan ninguna funcionalidad de restablecimiento de contraseña - si tienen Olvidó su contraseña y luego están bloqueados.

  2. Genera una nueva clave maestra segura y encripta & hash la clave del usuario con esta clave maestra y almacena el texto de cifrado y el resultado hash en la base de datos. A continuación, el usuario da a conocer la clave de seguridad al agregarla a un archivo que el usuario descarga, envía un correo electrónico al usuario o muestra la clave maestra de seguridad en la pantalla. Para restablecer la contraseña, el usuario tendría que ingresar esta clave maestra, que luego se procesa y compara, y si coinciden, la clave del usuario en la base de datos se descifra.

  3. Solicite al usuario que brinde 2 preguntas de seguridad y respuestas al registrarse; resuelve las respuestas y almacena las preguntas y responde el hash en la base de datos. La segunda respuesta se usa como la clave maestra para encriptar la clave del usuario. Para recibir un correo electrónico de solicitud de restablecimiento de contraseña, el usuario debe responder correctamente la primera pregunta. Una vez que hacen clic en el enlace en el correo electrónico, la página web realiza la segunda pregunta, si esto es correcto y los valores de los parámetros de cadena de consulta son válidos, utilice la respuesta a la segunda pregunta para descifrar la clave del usuario.

  4. Utilice una clave maestra global de la aplicación (tal vez almacenada en la aplicación web/UI y cifre y almacene la clave del usuario.) Una vez que se verifica mediante un proceso de restablecimiento de contraseña, la clave del usuario se descifra utilizando la aplicación . llave maestra global y luego reencrypted con su nueva contraseña

En resumen, los beneficios de cada opción es el siguiente:

  1. Ésta es la última de la seguridad y posiblemente sería la única opción si el da ta fue fundamental para mantenerse encriptado. Sin embargo, en el mundo real las personas olvidan sus contraseñas con la certeza de que sale el sol y no proporcionar una función de restablecer la contraseña podría ser una mala decisión comercial.

  2. Esto es seguro ya que la llave maestra no se almacena en el front-end o la base de datos, por lo que si la plataforma se ve comprometida, los datos requerirían un gran esfuerzo para descifrar. Sin embargo, la desventaja es que el usuario aún podría perder su clave maestra de todos modos.

  3. La debilidad aquí es si la base de datos se ve comprometida, la respuesta a la pregunta podría ser investigada y luego utilizada para descifrar la clave cifrada de los usuarios.

  4. Este enfoque deja la clave de la aplicación en la pila dejando sus datos vulnerables si su plataforma está hackeada. La única protección que tiene es que si el servidor de la base de datos está pirateado, los datos seguirán siendo seguros.

Al igual que con la mayoría de las cosas en el mundo del desarrollo de software debe tener en cuenta qué es lo mejor para lo que usted está tratando de lograr y el objetivo para el equilibrio correcto.

Cuestiones relacionadas