¿Cómo verifica facebook la autenticidad de la aplicación con hash clave?
Al desarrollar una aplicación android con facebook, se le requiere que cargue el hash clave de su aplicación en su sitio. Con esto afirman que son capaces de verificar que las llamadas a sus servidores se hacen en realidad desde su aplicación.
He leído esta pregunta ¿Cómo verifica Facebook las aplicaciones móviles, pero en realidad no proporciona la implantación real de esto. He intentado mirar en el código fuente de la biblioteca de Facebook pero no pude entenderlo.
- Acceso exclusivo al micrófono en Android
- Cómo proteger la llamada a webservice en Android
- Enigma de encriptación
- Dónde encontrar el usuario instalado certificado android 4.0 y superior
- ¿Cómo lograr alta seguridad en aplicaciones móviles?
¿Qué datos se envían fuera de la aplicación android y en qué cifrado que se puede verificar en contra de este hash en el servidor? ¿Es el método implementado por facebook fail safe?
Si lo es, y se puede implementar en cualquier servidor que podría utilizar para verificar en contra de mi servidor que mis aplicaciones no han sido recompilados con código diferente (Lo que suele suceder a menudo :()
Actualmente estoy implementando esta idea de esta manera:
Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures; for (Signature sig : sigs) { verifyInServer(sig.hashCode()); }
Donde verifyInServer es pseudocódigo para la comprobación hecha contra el servidor con el valor almacenado de las firmas. Ha funcionado por ahora, pero no estoy seguro de que sea seguro, y prefiero comprobar contra un hash clave (que su público) que esta firma de datos (que no estoy realmente seguro si es privado y no spoofable por el Usuario ).
- Usar bloqueo de pantalla en mi aplicación
- Android Central Keystore
- Implementar seguridad a nivel de firma en los servicios de Android con más de una firma permitida
- Keytool's -storepass vs. -keypass - ¿Por qué 2 contraseñas?
- Seguridad de aplicaciones móviles híbridas
- Restringir solicitudes de API solo a mi propia aplicación para móviles
- Cómo evitar que los elementos de compra de la aplicación de Android se rompan
- Android cifrar / descifrar sqlite base de datos 100% seguro
Se trata de la aplicación nativa de Facebook llamada a través de SDK que verifica una firma de la aplicación – por API incorporada en el sistema operativo Android – comprueba si coincide con hash o no. Hash es una especie de clave pública cuando la aplicación está firmada por clave privada.
Uno podría usar JS SDK para ingresar en el usuario en lugar de la aplicación nativa y luego el hash no se verificará (puede ser falsificado). De todos modos lo ven como no problema ya que en tales circunstancias el usuario verá en qué aplicación se conecta y necesita permitir el acceso de todos modos (el flujo de inicio de sesión pasa por el servidor FB y muestra el nombre de la aplicación). Usted no puede spoof uid en la cookie de Facebook aquí.
Uno también posiblemente podría meterse con la aplicación Facebook natve para que vea la aplicación no firmada como otro firmado uno saber hash de ese otro (pero esto sería una tarea bastante difícil si es posible, uno tendría que romperlo, cambiarlo y Funcionaría sólo en el sistema donde se había instalado la aplicación FB nativa modificada).
@ Zbysek respuesta es probablemente correcta, en eso es muy probable que la aplicación de Facebook es el que realmente realiza la verificación. Sin el código fuente de esta aplicación, es difícil saberlo con certeza, pero podemos inferir algunas cosas al inspeccionar el código fuente del proyecto de biblioteca API de Facebook, en particular el proceso de inicio de sesión como se codifica en las clases AuthorizationClient
y Session
.
-
En primer lugar, el cliente verifica que la propia aplicación de Facebook está correctamente firmada. Esto se espera, ya que no desea proporcionar sus credenciales de inicio de sesión a una aplicación falsa que se presenta como Facebook. Esto se hace en la clase
NativeProtocol
(y también en la clase deFacebook
, para los métodos obsoletos). Esta es la única mención de las firmas en la API , por lo que si hay verificaciones adicionales, son realizadas por la propia aplicación de Facebook o en el servidor. -
Session.open()
eventualmente crea unAuthorizationClient
que intenta una serie de posibles manejadores. Uno de ellos (el primero utilizado, si elSessionLoginBehavior
permite) es la propia aplicación de Facebook (por ejemplo conKatanaLoginDialogAuthHandler
, pero hay otros). -
Estos objetos
AuthHandler
eventualmente utilizantryIntent()
para llamar astartActivityForResult()
para invocar la propia aplicación de Facebook.
Por lo tanto, para resumir, el proceso de inicio de sesión:
- Verifica que la aplicación de Facebook es legítima,
- Termina llamando a una actividad dentro de la aplicación de Facebook,
- Llama a pasar la identificación de la aplicación FB, y algunos otros datos,
- Desde una actividad dentro de su aplicación , a través de
startActivityForResult()
.
Esta es una parte clave, ya que las actividades iniciadas con startActivityForResult()
(pero no las iniciadas con startActivity()
) pueden utilizar getCallingActivity()
para conocer la identidad (nombre del paquete y de la clase) de su llamador.
Por lo tanto, la aplicación de Facebook podría utilizar fácilmente esta información para consultar el PackageManager
, obtener la firma de la aplicación, pasar esos datos junto con el ID de la aplicación al servidor y validar que coincidan. Y como la aplicación de Facebook está firmada, tu aplicación puede confiar en este resultado.
Admito que esto es toda especulación, pero parece bastante plausible, dado lo que sabemos 🙂
Lamentablemente esto también significa que es poco probable que este mecanismo podría ser replicado para su propio uso de garantizar la autenticidad. A menos que seas Facebook o Google (Google Play Services tiene una función de verificación de firma similar, por ejemplo, para Maps) o puedes asegurar de alguna manera que una segunda aplicación también estará disponible en todos los dispositivos.
- ¿Cómo puedo obtener el nombre del contacto con su número?
- ¿Hay motores de física decentes para Android?