Almacenamiento local cifrado

La clase EncryptedLocalStore (ELS) proporciona un mecanismo de almacenamiento local cifrado que se puede utilizar como pequeña caché para los datos privados de una aplicación. Los datos de ELS no se pueden compartir entre aplicaciones. La finalidad de ELS es permitir que una aplicación pueda almacenar elementos que se facilitan frecuentemente, como las credenciales de inicio de sesión y otra información privada. Los datos ELS no se deben considerar como permanentes, tal y como se detalla en “Limitaciones del almacén local cifrado” y “Prácticas recomendadas” a continuación.

Nota: además del almacén local cifrado, AIR también proporciona cifrado para el contenido almacenado en bases de datos SQL. Para obtener más información, consulte Uso del cifrado con bases de datos SQL .

El almacén local cifrado resulta práctico para guardar información que debe estar protegida, como los datos de inicio de sesión para servicios web. EL ELS está indicado para almacenar información que deba permanecer privada para otros usuarios. Sin embargo, no protege los datos de otros procesos ejecutados en la misma cuenta de usuario. Por esto, no está indicado para proteger datos secretos de aplicaciones, como DRM o claves de cifrado.

En plataformas de escritorio, AIR utiliza DPAPI en Windows, KeyChain en Mac OS e iOS, y KeyRing o KWallet en Linux para asociar el almacén local cifrado a todas las aplicaciones y usuarios. El almacén local cifrado utiliza cifrado AES-CBC de 128 bits.

En Android, los datos guardados con la clase EncryptedLocalStorage no están cifrados. En su lugar, los datos se protegen con la seguridad de usuario proporcionada por el sistema operativo. El sistema operativo Android asigna a cada aplicación un ID de usuario distinto. Las aplicaciones solo pueden acceder a sus propios archivos y a archivos creados en ubicaciones públicas (por ejemplo, una tarjeta de memoria extraíble). Tenga en cuenta que, en dispositivos Android “raíz”, las aplicaciones que se ejecutan con privilegios de raíz PUEDEN acceder a archivos de otras aplicaciones. Así, en un dispositivo raíz, el almacenamiento local cifrado no proporciona un alto nivel de protección como sí lo hace en un dispositivo sin raíz.

La información en el almacén local cifrado solo está disponible para contenido de aplicaciones de AIR en el entorno limitado de seguridad de la aplicación.

Si actualiza una aplicación de AIR, la versión actualizada conserva el acceso a todos los datos existentes en el almacén local cifrado a no ser que:

  • Los elementos se hayan añadido con el parámetro stronglyBound establecido en true

  • La versión existente y la actualizada se publican en versiones anteriores a AIR 1.5.3 y la actualización está firmada con una firma de migración.

Limitaciones del almacén local cifrado

Los datos del almacén local cifrado se protegen con las credenciales de la cuenta en el sistema operativo del usuario. Otras entidades no pueden acceder a los datos del almacén a menos que puedan iniciar la sesión como usuario. Sin embargo, los datos no están seguros frente al acceso de otras aplicaciones ejecutadas por un usuario autenticado.

El usuario debe autenticarse para que funcionen estos ataques, por lo que los datos privados del usuario aún están protegidos (a no ser que la propia cuenta de usuario sea vulnerable). Sin embargo, la información que la aplicación pueda desear mantener en secreto para los usuarios, como las claves utilizadas para la administración de derechos digitales o de licencia, no está segura. Por lo tanto, el almacén local cifrado no es la ubicación adecuada para almacenar este tipo de información. Solo resulta un lugar apropiado para almacenar datos privados del usuario como, por ejemplo, contraseñas.

Los datos del ELS se pueden perder por muchos motivos. Por ejemplo, el usuario puede desinstalar la aplicación y eliminar el archivo cifrado. O el ID de edición podría cambiarse como resultado de la actualización. Por ello, el ELS debe tratarse como una memoria caché privada, no como espacio de almacenamiento de datos permanente.

El parámetro stronglyBound ya no se utiliza y no debe establecerse en true . Establecer el parámetro como true no aporta protección adicional a los datos. Al mismo tiempo, se pierde el acceso a los datos cada vez que se actualiza la aplicación, incluso si el ID de edición permanece invariable.

Es posible que el almacén local cifrado funcione más lento si los datos guardados superan los 10 MB.

Al desinstalar una aplicación de AIR, el programa de desinstalación no elimina los datos que tenga guardados el almacén local cifrado.

Prácticas recomendadas

Entre las mejores prácticas para el uso del almacén local cifrado (ELS) se incluyen:

  • Utilice el ELS para almacenar datos importantes del usuario como, por ejemplo, contraseñas (estableciendo stronglyBound en false)

  • No utilice el ELS para almacenar secretos de las aplicaciones como, por ejemplo, claves de DRM (administración de derechos digitales) o tokens de licencia..

  • Permite que la aplicación pueda recrear los datos almacenados en el ELS si estos se pierden. Por ejemplo, puede pedir al usuario que vuelva a introducir sus credenciales de cuenta de usuario cuando sea necesario.

  • No utilice el parámetro stronglyBound .

  • Si establece stronglyBound como true , no migre los elementos almacenados durante una actualización. Vuelva a crear los datos una vez concluida la actualización.

  • Almacene únicamente cantidades relativamente pequeñas de datos. Para cantidades más grandes, utilice una base de datos SQL de AIR con cifrado.

Cómo añadir datos al almacén local cifrado

Utilice el método estático setItem() de la clase EncryptedLocalStore para guardar datos en el almacén local. Los datos se guardan en una tabla hash, utilizando cadenas como claves, con los datos guardados en forma de conjuntos de bytes.

El código del ejemplo siguiente guarda una cadena en el almacén local cifrado:

var str:String = "Bob"; 
var bytes:ByteArray = new ByteArray(); 
bytes.writeUTFBytes(str); 
EncryptedLocalStore.setItem("firstName", bytes);

El tercer parámetro del método setItem() , el parámetro stronglyBound , es opcional. Cuando este parámetro se establece como true , el almacén local cifrado vincula el elemento guardado con los bits y la firma digital de la aplicación de AIR:

var str:String = "Bob"; 
var bytes:ByteArray = new ByteArray(); 
bytes.writeUTFBytes(str); 
EncryptedLocalStore.setItem("firstName", bytes, false); 

Para un elemento guardado con stronglyBound definido en true , las llamadas posteriores a getItem() solo tendrán éxito si la aplicación de AIR que llama es idéntica a la aplicación de almacenamiento (si no se ha cambiado ningún dato en los archivos del directorio de la aplicación). Si la aplicación de AIR que llama no es la misma que la que realiza el almacenamiento, la aplicación emite una excepción Error cuando se llama a getItem() para un elemento fuertemente vinculado. Si se actualiza la aplicación, esta no podrá leer datos fuertemente vinculados que se habían escrito en el almacén local cifrado. Se omite la definición de stronglyBound como true en dispositivos móviles; el parámetro siempre se trata como false .

Si el parámetro stronglyBound es establece en false (valor predeterminado), únicamente el ID de editor debe ser el mismo para que la aplicación lea los datos. Los bits de la aplicación pueden cambiar (y debe firmarlos el mismo editor), pero no es necesario que sean exactamente los mismos bits que estaban en la aplicación que almacenó los datos. Las aplicaciones actualizadas con el mismo ID de edición que el original pueden seguir accediendo a los datos.

Nota: en la práctica, establecer stronglyBound como true no añade ninguna protección adicional a los datos. Un usuario “malintencionado” podría alterar la aplicación para tener acceso a los elementos guardados en el ELS. Además, los datos tienen el mismo nivel de protección frente a amenazas externas de usuarios ajenos si se establece stronglyBound como true o como false . Por estos motivos, establecer stronglyBound como true no se recomienda.

Acceso a los datos del almacén local cifrado

Se puede recuperar un valor del almacén local cifrado utilizando el método EncryptedLocalStore.getItem() , como en el siguiente ejemplo:

var storedValue:ByteArray = EncryptedLocalStore.getItem("firstName"); 
trace(storedValue.readUTFBytes(storedValue.length)); // "Bob" 

Eliminación de los datos del almacén local cifrado

Se puede eliminar un valor del almacén local cifrado utilizando el método EncryptedLocalStore.removeItem() , como en el siguiente ejemplo:

EncryptedLocalStore.removeItem("firstName"); 

Para borrar todos los datos del almacén local cifrado, llame al método EncryptedLocalStore.removeItem() , como en el siguiente ejemplo:

EncryptedLocalStore.reset();