¿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.

¿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 ).

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 .

  1. 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 de Facebook , 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.

  2. Session.open() eventualmente crea un AuthorizationClient que intenta una serie de posibles manejadores. Uno de ellos (el primero utilizado, si el SessionLoginBehavior permite) es la propia aplicación de Facebook (por ejemplo con KatanaLoginDialogAuthHandler , pero hay otros).

  3. Estos objetos AuthHandler eventualmente utilizan tryIntent() para llamar a startActivityForResult() 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.

  • Esquema de autenticación para una aplicación de Android: cuando la tarjeta SIM está bloqueada o cambiada por otra, la aplicación deja de funcionar
  • Seguridad de PubNub contra una ingeniería inversa de una aplicación android
  • RSA PKCS1-OAEP padding es compatible con bouncycastle?
  • ¿El almacenamiento de la sal junto con el archivo cifrado romper la seguridad?
  • ¿Cómo verificar los datos de POST se envía desde la aplicación de Android con la firma SHA1 correcta?
  • Hacer que el teclado Android resista a los ataques de KeyLogger
  • XmlHttpRequest problema de publicación doble en Android
  • ¿Existen directrices de codificación para la plataforma Android que se centran en la seguridad?
  • Xamarin Código de Seguridad
  • Protección de contraseña de Android Keystore
  • Android Keystore - ¿se puede recuperar una clave de usuario por root si se establece en ese usuario?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.