Xamarin.Essentials: Armazenamento seguro

A classe SecureStorage ajuda a armazenar com segurança os pares de chave/valor simples.

Introdução

Para começar a usar essa API, leia o guia de introdução para Xamarin.Essentials garantir que a biblioteca esteja instalada e configurada corretamente em seus projetos.

Para acessar a funcionalidade SecureStorage, a seguinte configuração específica da plataforma é necessária:

Dica

O Backup Automático para Aplicativos é um recurso do Android 6.0 (nível da API 23) e posterior que faz o backup dos dados do aplicativo do usuário (preferências compartilhadas, arquivos no armazenamento interno do aplicativo e outros arquivos específicos). Os dados são restaurados quando um aplicativo é reinstalado ou instalado em um novo dispositivo. Isso pode afetar a SecureStorage, que utiliza as preferências de compartilhamento do backup e que não podem ser descriptografadas quando a restauração ocorrer. Xamarin.Essentials lida automaticamente com esse caso removendo a chave para que ela possa ser redefinida, mas você pode dar um passo adicional desativando o Backup automático.

Habilitar ou desabilitar o backup

Você pode optar por desabilitar o Backup Automático para todo o aplicativo definindo a configuração android:allowBackup como falsa no arquivo AndroidManifest.xml. Essa abordagem só é recomendada se você planeja restaurar dados de uma outra maneira.

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

Backup seletivo

O backup automático pode ser configurado para desabilitar o backup de um conteúdo específico. Você pode criar uma regra personalizada definida para excluir itens do SecureStore de passarem por backup.

  1. Defina o atributo android:fullBackupContent em seu AndroidManifest.xml:

    <application ...
        android:fullBackupContent="@xml/auto_backup_rules">
    </application>
    
  2. Crie um novo arquivo XML chamado auto_backup_rules.xml no diretório Resources/xml com a ação de compilação de AndroidResource. Em seguida, defina o seguinte conteúdo que inclui todas as preferências compartilhadas, exceto para 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 do armazenamento seguro

Adicione uma referência a Xamarin.Essentials em sua classe:

using Xamarin.Essentials;

Para salvar um valor para uma determinada chave no armazenamento 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 um valor do armazenamento seguro:

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

Observação

Se não houver valores associados à chave solicitada, GetAsync retornará null.

Para remover uma chave específica, chame:

SecureStorage.Remove("oauth_token");

Para remover todas as chaves, chame:

SecureStorage.RemoveAll();

Dica

É possível que uma exceção seja lançada ao chamar GetAsync ou SetAsync. Isso pode ser causado por um dispositivo que não suporta armazenamento seguro, alteração de chaves de criptografia ou corrupção de dados. É melhor lidar com isso removendo e adicionando a configuração de volta, se possível.

Particularidades de implementação da plataforma

O Repositório de chaves do Android é usado para armazenar a chave de criptografia usada para criptografar o valor antes que ele seja salvo em Preferências Compartilhadas com um nome de arquivo [ID-DO-SEU-PACOTE-DE-APLICATIVO].xamarinessentials. A chave (não uma chave de criptografia, a chave para o valor) usada no arquivo de preferências compartilhadas é um Hash MD5 da chave passada para as APIs do SecureStorage.

API de nível 23 e mais recente

Em níveis da API mais recentes, uma chave AES é obtida do Repositório de chaves do Android e usada com uma cifra AES/GCM/NoPadding para criptografar o valor antes que ele seja armazenado no arquivo de preferências compartilhadas.

API de nível 22 e inferior

Em níveis de API mais antigos, o Repositório de chaves do Android só é compatível com o armazenamento de chaves RSA, que é usado com uma cifra RSA/ECB/PKCS1Padding para criptografar uma chave AES (aleatoriamente gerada no runtime) e armazenado no arquivo de preferências compartilhadas sob a chave SecureStorageKey, caso ainda não tenha sido gerado.

SecureStorage usa a API Preferências e segue a mesma persistência de dados descrita na documentação de Preferências. Se um dispositivo fizer o upgrade do nível da API 22 ou inferior para o nível da API 23 e superior, esse tipo de criptografia continuará a ser usado, a menos que o aplicativo seja desinstalado ou RemoveAll seja chamado.

Limitações

Essa API destina-se a armazenar pequenas quantidades de texto. O desempenho pode ser lento se você tentar usá-lo para armazenar grandes quantidades de texto.

API

Encontre mais vídeos sobre o Xamarin no Channel 9 e no YouTube.