¿Cuál es la mejor manera de ocultar la contraseña de keystore en Android?
Soy nuevo en el desarrollo de Android y la implementación de SSLSockets. Después de hacer algunas excavaciones pude configurar un servidor / cliente simple que está funcionando. La implementación que siento podría usar un poco de trabajo y stumped en cómo cargar en la contraseña al almacén de la llave sin tenerla en texto llano. Aquí hay algún código que está en el lado del cliente. Como puede ver, tengo la contraseña codificada en una var local. ¿Hay una mejor manera de cargar en la contraseña keystore así que no lo tengo en texto sin formato en el código?
char [] KSPASS = "password".toCharArray(); char [] KEYPASS = "password".toCharArray(); try { final KeyStore keyStore = KeyStore.getInstance("BKS"); keyStore.load(context.getResources().openRawResource(R.raw.serverkeys), KSPASS); final KeyManagerFactory keyManager = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyManager.init(keyStore, KEYPASS); final TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustFactory.init(keyStore); sslContext = SSLContext.getInstance("TLS"); sslContext.init(keyManager.getKeyManagers(), trustFactory.getTrustManagers(), null); Arrays.fill(KSPASS, ' '); Arrays.fill(KEYPASS, ' '); KSPASS = null; KEYPASS = null;
Actualizar:
- Cómo proteger las preferencias compartidas de Android?
- Evitar el bloqueo del dispositivo en android mientras mi actividad está en ejecución Y el dispositivo está conectado al cargador
- ¿Qué es APPKEY en Truecaller API?
- ¿Cómo se puede comprobar el permiso en tiempo de ejecución sin lanzar SecurityException?
- Comprobar si el sistema de archivos Android está encriptado
Resulta que el cliente no necesita saber la contraseña keystore en absoluto. He modificado el código para pasar null como la contraseña. Hasta ahora las pruebas iniciales han funcionado con la comunicación al servidor. En el lado del servidor todavía carga la contraseña del almacén de claves.
final KeyStore keyStore = KeyStore.getInstance("BKS"); keyStore.load(context.getResources().openRawResource(R.raw.serverkeys), null); final KeyManagerFactory keyManager = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); keyManager.init(keyStore, null); final TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustFactory.init(keyStore); sslContext = SSLContext.getInstance("TLS"); sslContext.init(keyManager.getKeyManagers(), trustFactory.getTrustManagers(), null);
- Que es la forma más segura de incluir un par de clave (público / privado) en un apk
- ¿No debería Android StoreManager almacenar símbolos de OAuth en una base de datos por aplicación / UID?
- La consola del programador de Google Play rechazó mi actualización de aplicación
- Implementar seguridad a nivel de firma en los servicios de Android con más de una firma permitida
- ¿Es seguro almacenar nombre de usuario y contraseñas en un SQLite local db en Android?
- ¿Cómo puedo verificar si otra aplicación del sistema es genuina?
- Android Recomendación de seguridad en la aplicación: ¿qué significa esto?
- ¿El almacenamiento de la sal junto con el archivo cifrado romper la seguridad?
Bueno, esto no es un problema fácil para empezar.
Por ejemplo, podría solicitar la contraseña del usuario en el inicio de la aplicación para que la contraseña no está codificada en su código. Creo que este es el enfoque más seguro.
Si esto no es posible, entonces su problema surge si alguien tiene acceso a los frascos y "ve" el código y posteriormente la contraseña. Podría delegar al usuario la protección de estos frascos.
Si esto no es posible, entonces podría cifrar la contraseña y almacenarla en alguna parte. A continuación, en su código duro clave de la clave para descifrar la contraseña. Así que alguien que mira en el frasco no puede ver su contraseña real. Sólo la clave de descifrado. Por supuesto, si uno pone esfuerzo real que podría obtener la clave y tratar de encontrar dónde se encuentra la contraseña y descifrarlo y obtener la clave, pero requiere más esfuerzo para hacer.
Al final, depende de los requisitos de seguridad que tenga
Si realmente desea proteger las credenciales de los usuarios, debe pedirles que verifiquen su identidad siempre que desee acceder a las credenciales. Sin embargo la mayoría de los usuarios se molestan si usted les pide su contraseña cada vez que iniciar sesión, por lo que como el desarrollador debe decidir cuánto se preocupan por la seguridad vs proporcionar una interfaz simple y fácil para sus usuarios.
Una opción que podría considerar es almacenar las contraseñas, pero para cifrar la contraseña utilizando un PIN proporcionado por el usuario. Entonces, cada vez que el usuario desea acceder a su contraseña, simplemente proporcionan el PIN, que se utiliza para descifrar la contraseña.
- Eliminar datos de un solo objeto / fila de Realm en android
- Mostrar el icono de puntos azules en la ubicación actual Google Maps