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.