Xamarin.Essentials: Almacenamiento seguro

La clase SecureStorage ayuda a almacenar pares de clave-valor sencillos de manera segura.

Primeros pasos

Para empezar a usar esta API, lea la guía de introducción para Xamarin.Essentials con el fin de asegurarse de que la biblioteca está correctamente instalada y configurada en los proyectos.

Para acceder a la funcionalidad SecureStorage, se requiere la siguiente configuración específica para la plataforma:

Sugerencia

Copia de seguridad para aplicaciones es una característica de Android 6.0 (nivel de API 23) y versiones posteriores que crea copias de seguridad de los datos de aplicación del usuario (preferencias compartidas, archivos en el almacenamiento interno de la aplicación y otros archivos específicos). Los datos se restauran cuando se reinstala o instala una aplicación en un dispositivo nuevo. Esto puede afectar a SecureStorage, que utiliza las preferencias compartidas de las que se creó una copia de seguridad y que no se pueden descifrar cuando se realiza la restauración. Xamarin.Essentials controla automáticamente este caso quitando la clave para que se pueda restablecer, pero puede dar un paso adicional deshabilitando Copia de seguridad automática.

Habilitación o deshabilitación de copia de seguridad

Puede elegir deshabilitar Copia de seguridad automática para toda la aplicación al establecer el valor android:allowBackup en false en el archivo AndroidManifest.xml. Este enfoque solo se recomienda si planea restaurar los datos de otra manera.

<manifest ... >
    ...
    <application android:allowBackup="false" ... >
        ...
    </application>
</manifest>

Copia de seguridad selectiva

Es posible configurar Copia de seguridad automática para deshabilitar la copia de seguridad de contenido específico. Puede crear un conjunto de reglas personalizadas para excluir los elementos SecureStore de la copia de seguridad.

  1. Establezca el atributo android:fullBackupContent en AndroidManifest.xml:

    <application ...
        android:fullBackupContent="@xml/auto_backup_rules">
    </application>
    
  2. Cree un archivo XML denominado auto_backup_rules.xml en el directorio Resources/xml con la acción de compilación AndroidResource. Luego, establezca este contenido que incluye todas las preferencias compartidas, excepto SecureStorage:

    <?xml version="1.0" encoding="utf-8"?>
    <full-backup-content>
        <include domain="sharedpref" path="."/>
        <exclude domain="sharedpref" path="${applicationId}.xamarinessentials.xml"/>
    </full-backup-content>
    

Uso de Secure Storage

Agregue una referencia a Xamarin.Essentials en la clase:

using Xamarin.Essentials;

Para guardar un valor para una clave determinada en el almacenamiento seguro:

try
{
  await SecureStorage.SetAsync("oauth_token", "secret-oauth-token-value");
}
catch (Exception ex)
{
  // Possible that device doesn't support secure storage on device.
}

Para recuperar un valor desde el almacenamiento seguro:

try
{
  var oauthToken = await SecureStorage.GetAsync("oauth_token");
}
catch (Exception ex)
{
  // Possible that device doesn't support secure storage on device.
}

Nota:

Si no hay ningún valor asociado con la clave solicitada, GetAsync devolverá null.

Para quitar una clave específica, llame a:

SecureStorage.Remove("oauth_token");

Para quitar todas las claves, llame a:

SecureStorage.RemoveAll();

Sugerencia

Es posible que se produzca una excepción al llamar a GetAsync o SetAsync. Esto puede deberse a que un dispositivo no admita el almacenamiento seguro, las claves de cifrado cambiantes o los daños en los datos. Es mejor controlar esto mediante la eliminación y posterior reincorporación del valor, si es posible.

Detalles de implementación de la plataforma

Android KeyStore se usa para almacenar la clave de cifrado con la que se cifra el valor antes de guardarlo en Preferencias compartidas con un nombre de archivo [ID-PAQUETE-APLICACIÓN].xamarinessentials. La clave (no una clave criptográfica, la clave para el valor) usada en el archivo de preferencias compartido es un hash MD5 de la clave pasada a las API SecureStorage.

Nivel de API 23 y superior

En los niveles de API más nuevos, una clave AES se obtiene de Android KeyStore y se usa con una cifra AES/GCM/NoPadding para cifrar el valor antes de que se almacene en el archivo de preferencias compartidas.

Nivel de API 22 e inferior

En los niveles de API anteriores, Android KeyStore solo admite el almacenamiento de claves RSA, que se usa con una cifra RSA/ECB/PKCS1Padding para cifrar una clave AES (generada de manera aleatoria en tiempo de ejecución) y se almacena en el archivo de preferencias compartidas en la clave SecureStorageKey, si todavía no se ha generado una.

SecureStorage usa la API Preferences y sigue la misma persistencia de datos que se describe en la documentación sobre Preferencias. Si se actualiza un dispositivo desde Nivel de API 22 o inferior a Nivel de API 23 y superior, se seguirá usando este tipo de cifrado a menos que la aplicación se desinstale o se llame a RemoveAll.

Limitaciones

Esta API está pensada para almacenar pequeñas cantidades de texto. El rendimiento puede ser lento si intenta usarla para almacenar grandes cantidades de texto.

API

Encuentre más vídeos de Xamarin en Channel 9 y YouTube.