android - que - ssl protocolo
¿Qué tan seguros son los certificados SSL de los clientes en una aplicación móvil? (5)
¿Está haciendo la autenticación del lado del cliente con certificados sobre SSL? No es que realmente importe para esta pregunta. Cualquier clave privada que almacene en su aplicación es accesible para un atacante. Cada cliente debe tener su propio certificado y par de claves, para evitar un compromiso masivo. Su servidor también debe hacer cumplir las protecciones, asegurando que un cliente comprometido no pueda solicitar nada.
Esto es cierto para cualquier esquema de autenticación. Si incrusta contraseñas, claves de API, claves de descifrado, lo que sea. Cualquier cosa en el dispositivo debe ser asumida como accesible.
La seguridad adicional de los certificados proviene en parte de que no hay nada que ver con la fuerza bruta. Si eligió la ruta de usuario / contraseña para cada cliente, las contraseñas se pueden adivinar. Lo mismo con las claves API (aunque son más largas y duras). Con los certificados, es una clase de ataques completamente diferente y un problema considerablemente más difícil.
Pero, lo más importante, el servicio backend no debería permitir que la aplicación haga nada que normalmente no haría.
Ahora, al tratar con certificados, vas a tener una gran cantidad de otros problemas. Probablemente desee firmar cada certificado de cliente con su certificado CA autofirmado. La gestión de ese certificado CA puede ser problemática, dependiendo de su caso de uso. ¿Va a generar estos certificados de cliente sobre la marcha, o manualmente usted mismo? Es decir, ¿es esta una aplicación que un millón de personas puede descargar y necesitas un sistema automatizado para generarlas? ¿O es esta una aplicación privada / interna que personalmente manejará para generar certificados?
Me gustaría tener una comunicación segura entre mi aplicación Android / iOS y mi servicio backend accesible a través de Internet, por lo que estoy investigando HTTPS / SSL.
Si creo certificados autofirmados, luego coloco un certificado de cliente en la aplicación y hago que el servicio back-end requiera ese certificado de cliente, ¿ es esto realmente seguro ?
Aquí es por qué estoy preguntando. Parece que el certificado del cliente podría ser "hackeado" interrogando al .apk. El certificado del cliente es solo una constante de cadena, ¿verdad? Eso significa que cualquiera podría usar el certificado del cliente para acceder a mi backend. ¿Es el .apk (y el equivalente de iOS) lo suficientemente opaco para evitar que se descubra el certificado del cliente ?
Daniel Guillamot, algunos trucos que he visto:
- tecla del lado del servidor dividido Haga que la frase de contraseña para la clave SSL sea el resultado de la cadena XOR cadena-en-aplicación cadena de búsqueda de servicio web.
- haga que la cadena en la aplicación se cree llamando a algunas funciones de la aplicación, en lugar de la cadena codificada.
- negar el rastreo de la aplicación mientras se está ejecutando, para evitar que alguien recoja la frase de contraseña final cuando llama al descifrado de la clave privada. Ref. http://books.google.no/books?id=2D50GNA1ULsC&lpg=PA294&ots=YPQQ7DLjBD&dq=The%20example%20just%20shown%20demonstrates%20how%20calls%20to%20ptrace%20can%20be%20hijacked&hl=no&pg=PA293#v=onepage&q&f=false
Me encantaría escuchar más si alguien tiene otras ideas.
Normalmente, los certificados SSL de los clientes se almacenan en almacenes de claves (BKS con formato en el caso de Android) y el almacén de claves se incluye como un recurso dentro de su APK. Los almacenes de claves están encriptados y protegidos con una contraseña. Por lo tanto, ese certificado de cliente no se puede extraer fácilmente de un archivo APK, ya que se almacena en forma cifrada.
Ahora ... ¿qué haces con la contraseña? Aquí está el quid de la cuestión y tienes dos alternativas.
Si desea que su aplicación pueda comunicarse con el servidor (por lo tanto, para poder acceder al certificado) sin la interacción del usuario, deberá insertar la contraseña en su aplicación y luego, sí, un atacante podría aplicar ingeniería inversa a su código. para encontrarlo, tome el almacén de claves y luego descifre para recuperar el certificado. Puede aplicar técnicas como ofuscar su código para que sea más difícil para un atacante hacerlo, pero esto solo ralentizará a alguien y no lo impedirá.
Su alternativa es solicitar al usuario una contraseña cada vez que su aplicación se comunique con el servidor y usarla para descifrar el almacén de claves (o preguntar cuándo se inicia la aplicación y guardar el certificado en caché durante un período de tiempo determinado). La ventaja aquí es que si alguien invierte la ingeniería de su APK, encontrará el almacén de claves cifrado y ninguna contraseña para que su certificado sea seguro. La desventaja es que el usuario proporcione la contraseña.
¿Cuál es el mejor enfoque? Depende completamente de la sensibilidad de los datos que le preocupan y del nivel de riesgo que está dispuesto a aceptar. Sólo usted puede contestar a esa pregunta.
Se puede acceder y copiar a APK, por lo que poner cualquier cosa en él no será de ayuda. Sería necesario activar y quizás vincular el certificado al dispositivo después de la instalación. La vinculación se puede hacer, por ejemplo, poniendo el IMEI del dispositivo en una de las extensiones de certificado y pasando el IMEI junto con el certificado de su aplicación (o, mejor, pase el IMEI después de la autenticación y el establecimiento del canal seguro).
El certificado es inofensivo. Es la clave privada la que necesita protección y es tan segura como el dispositivo en sí, no más segura. Distribuir el certificado y la clave privada con la aplicación solo significa que cualquier persona que tenga la aplicación tiene la clave, por lo que no le proporciona ninguna seguridad. Creo que necesitas algún tipo de paso de registro posterior a la instalación.