¿Cómo guardar efectivamente la contraseña de la base de datos dentro de la aplicación de escritorio?

2

Supongamos que estamos en el campo de las aplicaciones de escritorio que necesitan almacenar sus datos en una base de datos. ¿Cómo almaceno la contraseña para esta base de datos evitando los errores más evidentes, que son:

1) codifique la contraseña de la base de datos dentro del código (citado como # 21 codificando horror en „Contraseñas codificadas“ dentro de enlace )

2) cifrando la contraseña de la base de datos y almacenándola en un archivo, cambiaría el problema a: „¿dónde almaceno la contraseña que cifra la contraseña de la base de datos?"

3) utilizando un servidor de base de datos remoto y una arquitectura de n niveles donde el programa no accede directamente a la base de datos sino que se autentica con otra capa que otorga cada operación y la envía a la capa de la base de datos. Todo se encripta a través de ssl y la autenticación se realiza a través de un certificado digital (por lo tanto, mediante el uso de criptografía de clave pública).

¡El número 3 es en realidad una solución, pero no se aplica a las aplicaciones de escritorio que necesitan trabajar sin conexión!

Alguien en otra pregunta similar respondió que "dar a los usuarios no confiables acceso confiable a un sistema" no es factible, por eso el DRM nunca funcionó, sin embargo, no citó un estudio comprobado ni un teorema comprobado.

Observe que ocurre el mismo problema si queremos cifrar la base de datos: ¿dónde almaceno la contraseña con la que cifro una base de datos en una aplicación de escritorio?

¿Alguien puede arrojar alguna idea? Gracias

NOTA: este mismo problema se trata en CWE-259: Uso de contraseña codificada de forma rígida pero no se explica ninguna solución definitiva

    
pregunta dendini 02.05.2013 - 16:52
fuente

4 respuestas

3

Cualquier persona que tenga acceso total a ese programa puede recuperar cualquier clave secreta que incruste en un programa. Lo mejor que puede hacer es hacer que tarde mucho tiempo en hacerlo.

  

Pero digamos que puedes hacer que el secreto sea totalmente irrecuperable al analizar el binario.

El usuario podría realizar un análisis dinámico ejecutando el programa mientras supervisa su memoria y esperar a que se construya la clave.

  

De acuerdo, supongamos que has logrado usar una clave sin tener que construirla completamente en la memoria de alguna manera.

La clave aún debe ser usada para algo, y el usuario podría examinar ese mecanismo y usar la clave anti-forense de la misma manera.

  

Digamos que el mecanismo para construir y usar la clave está totalmente oculto más allá de la recuperación.

La clave aún debe salir de su programa para que sea útil fuera de él. Podría simplemente hacerme pasar por una base de datos en espera de que se me pasara mi clave secreta, no tendría que analizar su programa en absoluto. Cualquier forma de cifrado que utilice debería ser legible por el software de base de datos my , que también tengo el control total de los pares de llaves y demás.

  

Pero he escrito mi propio formato de base de datos que se carga en el mismo programa que la clave que no puede leer.

Así que tu programa está completamente bloqueado y todo sucede dentro. Excepto que no es así, cargará bibliotecas dinámicas que podría editar y cambiar así el comportamiento de su programa.

En última instancia, no hay nada que se ejecute en mi máquina que no tenga control final sobre. Esto no es algo que puedas evitar.

    
respondido por el lynks 02.05.2013 - 20:18
fuente
2

No puedes. Es un problema de chicken or egg .

Haga que el usuario de la aplicación ingrese la contraseña cada vez que se use la base de datos.

    
respondido por el Ayrx 02.05.2013 - 16:55
fuente
1

Dice que lo siguiente no se aplica porque las aplicaciones de escritorio necesitan trabajar sin conexión:

  

Utilizando un servidor de base de datos remoto y una arquitectura de n niveles donde el programa no accede directamente a la base de datos, sino que se autentica con otra capa que otorga cada operación y la envía a la capa de la base de datos. Todo se encripta a través de SSL y la autenticación se realiza a través de un certificado digital (por lo tanto, mediante el uso de criptografía de clave pública).

Si su aplicación necesita trabajar sin conexión y puede funcionar sin conexión, entonces una de estas es verdadera:

  • La base de datos se almacena localmente, en cuyo caso no es necesaria una contraseña, ya que el usuario solo tiene acceso a sus propios datos. Un ejemplo de esto sería respaldar su aplicación con una base de datos SQLite.
  • La base de datos se almacena de forma remota, pero la capacidad de conectarse a ella es opcional. Si este es el caso, puede pasar por la autenticación adecuada cuando la aplicación ya no se ejecute sin conexión.
respondido por el Matt 02.05.2013 - 19:43
fuente
0

Para una aplicación de escritorio, preferiría el hashing de contraseñas con salt. El hash con SHA-256 o SHA-1 más sal parece bueno. Porque lo ideal es obtener una clave de cifrado para un sistema independiente como se explicó anteriormente mediante un truco malicioso. el hashing es una forma de sal de la calle que garantiza cierta fortaleza, por lo que no es tan malo

    
respondido por el samuel owino 05.07.2016 - 19:21
fuente

Lea otras preguntas en las etiquetas