¿Cómo almacenar conversaciones de chat en mi sitio web?

5

Estoy creando un sitio donde los miembros pueden tener chats uno a uno, y no estoy seguro de cómo debo procesar los textos de conversación. ¿Debo almacenar el texto en un archivo .txt o directamente en una base de datos?

También me pregunto si debo cifrar el texto de alguna manera, de modo que si alguien obtiene la base de datos, no obtendrá un texto claro de las conversaciones de mis miembros. Los miembros de mi sitio se registran para pasar el rato con otras personas por diversión, así que no creo que haya algo súper secreto en sus conversaciones. Sin embargo, solo quería agregar esa capa de seguridad y, al mismo tiempo, obtener experiencia si necesitaré mantener el texto enviado por los usuarios en secreto en el futuro.

    
pregunta DannyCruzeira 18.08.2012 - 13:06
fuente

3 respuestas

5

No es particularmente limpio, eficiente o simple, pero hay un esquema que lo hará por usted.

  1. Genere un par de claves RSA para cada usuario.
  2. Genere una clave de almacenamiento a partir de la contraseña del usuario, usando una función de derivación de claves (por ejemplo, PBKDF2)
  3. Cifre la clave privada con AES, usando la clave de almacenamiento.
  4. Calcular hash HMAC-SHA256 para las claves públicas y privadas, usando la clave de almacenamiento como la clave HMAC.
  5. Almacene estos valores en la base de datos.

Al enviar un mensaje de Alicia a Bob, haga lo siguiente:

  1. Alice genera una clave de mensaje y la cifra con la clave pública de Bob.
  2. Alice cifra su mensaje con la clave de mensaje.
  3. Alice calcula su clave de almacenamiento, usando su contraseña. Ella usa esto para descifrar su clave privada, luego verifica que los hashes HMAC-SHA256 coincidan con sus claves públicas y privadas.
  4. Alice concatena el mensaje cifrado y la clave cifrada en un solo texto cifrado y lo firma utilizando su propia clave privada.
  5. Alice envía el texto cifrado a Bob.

Cuando Bob quiere leer el mensaje:

  1. Bob calcula su clave de almacenamiento, usando su contraseña. Él usa esto para descifrar su clave privada, luego verifica que los hashes HMAC-SHA256 coincidan con sus claves públicas y privadas.
  2. Bob descifra la clave de mensaje de Alice con su clave privada.
  3. Bob usa la clave del mensaje para descifrar el mensaje.
  4. Bob autentica el mensaje al verificar la firma digital con la clave pública de Alice.

Este esquema tiene las siguientes propiedades:

  • Los mensajes capturados de la base de datos no se pueden descifrar sin conocer las contraseñas de los usuarios.
  • Las claves privadas no se pueden descifrar sin conocer las contraseñas de los usuarios.
  • Cada mensaje está cifrado con una clave independiente.
  • Un atacante con privilegios de escritura en la base de datos puede falsificar un mensaje de un usuario, reemplazando su clave pública, pero se avisará al usuario que lo envía cuando inicie sesión, ya que los hashes HMAC no coincide.

Si la consideración de seguridad final es un problema, considere enviar un resumen de la clave pública del remitente en cada mensaje. De esta manera, si se produce una conversación legítima en cualquier momento, el sistema puede verificar la clave pública comparándola con el resumen enviado en conversaciones anteriores.

    
respondido por el Polynomial 20.08.2012 - 11:22
fuente
5

No te preocupes por el cifrado. No importa (desde una perspectiva de seguridad) si está en un archivo .txt o en una base de datos. En cambio, lo más importante que puede hacer para la seguridad y privacidad de sus usuarios es:

¡No conserve los datos por más tiempo de lo absolutamente necesario!

La gente tiene ciertas expectativas sobre el chat. Esperan que el chat en línea sea como chatear fuera de línea (en su porche, o algo así): que no haya un registro permanente de todos los chats. La gente probablemente espera que las conversaciones normalmente se mantengan privadas. Por lo tanto, no violar sus expectativas. No mantengas registros de sus chats. Borre todos los registros después de un tiempo razonable (por ejemplo, después de un día o lo más rápido que pueda). Luego, si está comprometido, el daño será moderado, y no tendrá que ir directamente a sus usuarios, admitiendo que los hackers han tenido acceso a todos sus chats pasados, todo el tiempo.

    
respondido por el D.W. 19.08.2012 - 00:35
fuente
2

El chat debe estar cifrado, aunque solo sea a la ligera, para que no sea trivial de ver. También elimine las líneas anteriores a un mes o cuando el registro se convierta en más de 300 líneas, entonces, si la base de datos y la clave de descifrado están comprometidas alguna vez, su privacidad estará algo protegida. Sin embargo, el usuario puede querer guardar el chat (lo haría), así que lo mejor es darles la opción de almacenarlo durante un período más prolongado y descargar todo lo que se eliminaría del servidor.

No estoy seguro de si es útil cifrarlo con la contraseña del usuario. Incluso puede hacer que sea más fácil para el atacante, con una inyección de SQL puede ver las contraseñas del usuario. Una clave de descifrado codificada ofrecería un segundo factor; La base de datos comprometida no es suficiente. Sin embargo, siempre es posible encontrar una clave de descifrado cuando el servidor está comprometido (lo que puede ser más fácil cuando se viola la base de datos, especialmente cuando un atacante puede escribir en la base de datos), por lo que no se puede confiar completamente en él.

La única forma de proteger realmente los chats del usuario es generar un par de llaves público y privado, y hacer que el usuario descargue la clave privada sin guardar una copia. El chat se puede descifrar con la clave privada (debe ingresarse al cargar cualquier chat de la base de datos), y con la clave pública puede cifrar y almacenar el chat. Probablemente esto sea poco práctico y demasiado trabajo, sin embargo.

    
respondido por el Luc 18.08.2012 - 19:41
fuente

Lea otras preguntas en las etiquetas