Escribiendo un sistema de administración de contraseñas, necesita asesoramiento sobre el almacenamiento de la base de datos

0

Estoy escribiendo un sistema de administración de contraseñas de colaboración y tengo preguntas relacionadas con el almacenamiento de contraseñas encriptadas. Básicamente, me gustaría que varios usuarios puedan acceder y cambiar una base de datos.

Nivel alto:

  • El usuario ejecuta el cliente que solicita la autenticación de nombre de usuario / contraseña (respaldada con AD / Samba / Radius / local).
  • En caso de éxito, el usuario debe ingresar una contraseña compartida . Esto debe ser conocido por todos los usuarios que tienen acceso.
  • La base de datos cifrada se envía al cliente, que la descifra y la muestra al usuario autenticado.

Un poco más detallado:

  • Tras la inicialización de la base de datos, se genera una clave aleatoria y se cifra con la contraseña del conjunto de claves legible. Esta clave cifrada se almacena en el disco.
  • Cada entrada en la base de datos que contiene contraseñas se almacena encriptada con la clave original.
  • Por lo tanto, se requiere la contraseña del conjunto de claves para descifrar el resto de las contraseñas.
  • La contraseña del conjunto de claves también se puede actualizar sin volver a cifrar toda la base de datos. Todo lo que sucede es que descifras la clave con la contraseña anterior y la vuelves a cifrar con la nueva.

¿Esto es todo para nada? ¿Se considera esto mal diseño? Mi objetivo es evitar que alguien simplemente descargue la base de datos si se le da acceso al servidor. Le transmití esto a un amigo mío que medio bromeando dijo "Sí, porque esto evita que la gente robe la base de datos de Chrome". ¿Qué tan seriamente debo tomar eso?

¿Alguna recomendación para un diseño adecuado, algoritmos para usar, etc.?

    
pregunta Goodies 01.03.2017 - 22:35
fuente

2 respuestas

2

Tu solución funcionaría para un equipo muy pequeño. Cualquiera que conozca la contraseña del anillo de claves podrá ver todos los secretos almacenados en la base de datos. Si desea eliminar un usuario, deberá cambiar la contraseña y redistribuirla al resto del equipo.

Un mejor enfoque para la base de datos de secretos de colaboración sería utilizar el cifrado asimétrico. Considera este diseño:

  • Cada usuario tiene su propia clave privada y pública registrada en la base de datos
  • La clave privada se almacena encriptada con AES (u otro algo simétrico), con la clave derivada desde una contraseña de usuario
  • La clave pública se almacena sin cifrar
  • Cada secreto está cifrado con una clave generada a partir de un CPRNG fuerte
  • La propia clave está encriptada con la clave pública de los usuarios
  • El intercambio de un secreto se realiza mediante el cifrado de la clave generada con una clave pública del usuario con el que desea compartir el secreto

Esto es aproximadamente como otros administradores de contraseñas ( por ejemplo, LastPass ) comparten secretos.

    
respondido por el Marko Vodopija 04.03.2017 - 12:55
fuente
0

Mirando tu propuesta, tiendo a pensar que no hay una ventaja masiva sobre tener, por ejemplo. KeePass está disponible para los usuarios y una ubicación central para almacenar los diversos archivos de la base de datos.

Como lo menciona @ MarkoVodopija , el mayor problema aquí es que eliminar el acceso para un usuario determinado es no trivial una vez que entregue la base de datos en primer lugar. Esto requeriría tanto cambiar la contraseña de la base de datos en sí (como obtener la nueva contraseña para todos los usuarios legítimos), así como también cambiar todas las contraseñas presentes en la base de datos.

Un documento que le puede resultar útil es la descripción general de seguridad de Hashicorp Vault ( enlace ). Puede ayudarlo. haga un esfuerzo por determinar cuál es su propio modelo de amenaza y vea si, y dónde, su solución actual se queda corta.

    
respondido por el iwaseatenbyagrue 04.03.2017 - 13:34
fuente

Lea otras preguntas en las etiquetas