Dónde almacenar hashes, sales, claves en Aplicaciones de Escritorio

Estoy tratando de averiguar dónde o cómo debo almacenar secretos de aplicaciones y claves dentro de una aplicación de escritorio.
Por ejemplo, una clave de aplicación de Facebook o una clave de la caja de depósito y secreto.

Así que he leído que debería hash, sal, cifrar etc etc estos valores. Esto es para evitar que alguien de ingeniería inversa mi código y ver las claves.

Todo está bien y bien, pero con todos estos métodos, sólo estoy almacenando un valor de sal o hash en algún lugar en lugar de la clave en sí, al final. Sin duda, si un hacker puede llegar a la sal / hash y posiblemente el código fuente, que será capaz de descifrar la clave cifrada y obtener mi contraseña / clave / secreto de todos modos?

Una opción que he leído acerca de que parece que el más seguro es no almacenar este valor en la aplicación de escritorio en absoluto, pero para llamar a un servicio web para obtener la clave (probablemente cifrado). Pero mi pregunta es, incluso en este caso, un hacker decente seguramente sólo hará un volcado de memoria o algo para ver lo que el valor devuelto por el servicio web es, y luego estamos de vuelta en el cuadrado 1.

La siguiente mejor alternativa parece ser la oscuridad.

¿Estoy perdiendo algo por completo?

En una nota lateral, ¿qué uso será un facebook / twitter / dropbox / etc clave / secreto a un hacker de todos modos? ¿Seguramente todavía necesitarían las credenciales de un usuario o el token de acceso para poder utilizarlo de todos modos?

Cualquier consejo o sugerencia será apreciado.

Para cada cuenta de usuario, genere un nuevo token de acceso para la aplicación cuando se inicie correctamente en su servicio. Su servicio de inicio de sesión debe diseñarse como un inicio de sesión para un sitio web:

  • La API sólo debe permitir un número de set (digamos 5) intentos de inicio de sesión incorrectos que reporta al cliente de escritorio que el nombre de usuario / contraseña no coinciden.
  • La API debe devolver un token afiliado sólo a ese usuario cuando el usuario inicie sesión correctamente.
  • Utilice SSL y un método de hashing localizado para pasar contraseñas de usuario a su API

Este token de autenticación proporcionado por su API sólo funcionará para la cuenta individual y, como tal, sólo permitirá al usuario realizar operaciones en su cuenta individual. Por ejemplo, si un usuario desea realizar una operación, debe ser capaz de proporcionar un token de autenticación válido para completar la acción. Utilizando este método, los atacantes podrán obtener una clave de autenticación, pero esa clave de autorización sólo podrá realizar operaciones para la cuenta en la que se genera. No podrá realizar operaciones en ninguna otra cuenta. La idea aquí es dejar que se metan con los datos, pero para mantener la actividad mal compartida a una cuenta.

A partir de ahí, si tiene llamadas API genéricas (por ejemplo, una búsqueda de imágenes) que accede a datos de varias cuentas, asegúrese de que nunca vuelve o permite que ninguna cuenta acceda a todos los datos de su sistema de forma absoluta. Proporcione sólo un número limitado de registros. En este caso, el sistema sigue realizando su trabajo, pero en ningún momento permite acceder a todos los registros de su sistema.

Normalmente implemento un servicio como este:

  • El usuario inicia sesión y obtiene un token de autenticación. Guardo dicho token de autenticación en una base de datos asociada con ese usuario.
  • El usuario llama al servicio web con símbolo de autenticación. Busco la cuenta de usuario mediante el token de autenticación transmitido y el ID de usuario (dos formas de autenticación) y utilizo la cuenta de usuario descubierta para realizar todas las operaciones. No sólo asumo que el ID de usuario es correcto, tiene que ser el que el auth token autenticado contra.
  • Si un usuario necesita realizar una operación delicada como restablecer una contraseña, mi aplicación abre una ventana del navegador o una tarea del explorador en la aplicación donde el usuario puede solicitar y administrar un restablecimiento. Puedo proteger más fácilmente una aplicación web que una en un cliente desconocido.

Utilizando estos métodos, debería ser capaz de hacer una aplicación de escritorio completamente operativa. Existen valores anómalos para esta funcionalidad, si tiene algún mensaje en los comentarios y podemos profundizar en el problema y ver si esta solución todavía puede funcionar para usted.

  • ¿Hay una manera de mostrar los números primero en el teclado virtual para Android?
  • NFC Mifare Ultralight etiquetas de escritura
  • Volley deliverResponse no se llama
  • Cómo realizar la búsqueda en el texto en árabe en JAVA?
  • GetView () no puede lanzar Exception
  • ¿Cuál es la diferencia entre setVideoPath de VideoView y setVideoURI
  • El controlador no pudo establecer una conexión segura con SQL Server mediante el cifrado de Secure Sockets Layer (SSL)
  • Phonegap / Cordova Paquetes de aplicaciones en Jelly Bean - Access-Control-Allow-Origin y setAllowUniversalAccessFromFileURLs
  • Envío de paquetes UDP desde ANDROID 2.2 (deseo de HTC)
  • Calendario de Android Java getDisplayName / s devolver null
  • No se puede escalar con Drawable con ScaleDrawable
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.