Compartiendo información entre dos aplicaciones de forma segura

Hace algún tiempo nos surgió la necesidad de crear una comunicación segura de información entre dos aplicaciones en un dispositivo Android y dado que uno de los requisitos era que lo controlara el propio sistema operativo, y tras una búsqueda para ver las posibilidades que había decidimos usar un permiso en el AndroidManifest.xml asignándole un nivel de protección, el interesante para esto es el android:protectionLevel, que identifica y avisa al usuario a la hora de instalar la aplicación del riesgo del permiso, además de determinar el procedimiento que tiene que seguir el sistema a la hora de tratar la aplicación.

<permission android:name="permissionName” android:protectionLevel="levelofprotection">

Niveles de protección

Hay cuatro tipos de niveles de protección:

  • Normal: es el que tienen los permisos asignados por defecto, no supone un riesgo para el sistema ni para el usuario ya que el permiso que tenga asignado este nivel sólo va a poder acceder a recursos de la propia aplicación, como no suponen un riesgo, el sistema da acceso por defecto sin pedir confirmación al usuario.
  • <permission android:name="permissionName” android:protectionLevel="levelofprotection">
  • Peligroso: es el que más riesgo supone para el dispositivo y para el usuario, ya que los permisos que usan este nivel están pidiendo acceso a la información privada del usuario, estos al suponer un riesgo se muestran explícitamente al usuario y se requiere que lo confirme.
  • <permission android:name="permissionName” android:protectionLevel="dangerous" />

    Así es como se muestan al usuario los permisos de este tipo cuando requieren confirmación:

    Permissions are displayed

  • De firma: en este caso sólo da acceso si la aplicación que pide acceso al recurso está firmada con las mismas credenciales que el permiso en cuestión.
  • <permission android:name="permissionName” android:protectionLevel="signature" />
  • De firma o de sistema: finalmente este nivel da acceso a las aplicaciones que tengan las mismas credenciales, como las anteriores o bien se encuentren en la imagen del sistema.
  • <permission android:name="permissionName” android:protectionLevel="signatureOrSystem" />

Nosotros utilizamos la tercera signature, lo que nos permitió acceder a los recursos de una aplicación desde la otra sólo en el caso de que las credenciales utilizadas para firmar ambas aplicaciones fueran las mismas, evitando así, que aplicaciones de terceros pudieran acceder a la información que nosotros estábamos exponiendo en un recurso de la aplicación, sin tener que recurrir a lugares públicos del sistema como un ContentProvider y sin tener que tener a la aplicación que quiere acceder al recurso pendiente de que la otra aplicación le pase la información, como sería el caso de un BroadcastReciever.

Además de todo eso, aquí teneís la forma de saber programaticamente el nivel de permiso que tiene una aplicación:

getAplicationContext().getPackageManager().getPermissionInfo(name,  0).protectionLevel

Acerca de Luis Revilla

Full Stack Developer / DevOps enamorado de las arquitecturas CLEAN. Me encanta automatizar y Dockerizar 🐋 todo. Probablemente ando por las nubes ⛅️⛅️ (Google Cloud, AWS y Azure)

Deja un comentario

Responsable » Solidgear.
Finalidad » Gestionar los comentarios.
Legitimación » Tu consentimiento.
Destinatarios » Los datos que me facilitas estarán ubicados en los servidores SolidgearGroup dentro de la UE.
Derechos » Podrás ejercer tus derechos, entre otros, a acceder, rectificar, limitar y suprimir tus datos.

¿Necesitas una estimación?

Calcula ahora