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.
- Obtener el contexto dentro de una vista personalizada?
- Servicio de Android para PubNub
- La llamada requiere el nivel 11 de la API (el min actual es 8) android.app.Activity # onCreateView
- Las clases siguientes no pudieron ser instanciadas: - android.support.v7.widget.Toolbar
- ¿Por qué un Comparator debería implementar Serializable?
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.
- Cómo comparar una cadena de Intent.getStringExtra ()?
- Problema de análisis de tiempo en Android
- ¿Cuál es la mejor práctica para compartir modelos entre un servidor API WEB y una aplicación cliente Android?
- Nombre de la unidad organizativa
- Cómo reemplazar la etiqueta <br \ />
- Inserte un número de cadena que empiece por cero en la columna de cadena usando ContentValues, pero el cero inicial siempre se elimina
- Analizar Google plus login
- No pasar nada a un AsyncTask en Android
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.
- Mi barra de estado en el android 4.2.2 emulador está roto
- Cómo detener el looper de HandlerThread de forma segura