Armazenamento local criptografado

A classe EncryptedLocalStore (ELS) oferece um mecanismo de armazenamento criptografado que você pode usar como um pequeno cache para os dados privados de um aplicativo. Os dados de ELS não podem ser compartilhados entre aplicativos. O objetivo do ELS é permitir que um aplicativo armazene com facilidade itens criados, como credenciais de login e outras informações privadas. Os dados de ELS não devem ser considerados permanentes, conforme é descrito em "Limitações do armazenamento local criptografado" e em "Melhores práticas" abaixo.

Nota: Além do armazenamento local criptografado, o AIR também fornece criptografia para conteúdo armazenado em bancos de dados do SQL. Para obter detalhes, consulte Uso da criptografia com bancos de dados SQL .

Você pode querer utilizar o armazenamento local criptografado para colocar em cache informações que precisam ser protegidas como, por exemplo, credenciais de login para serviços web. O ELS é apropriado para armazenar informações que precisam ser mantidas e forma particular. No entanto, ele não protege os dados contra outros processos executados da mesma conta de usuário. Por esse motivo, ele não é apropriado para proteger dados secretos de aplicativos como, por exemplo, informações de DRM e chaves de criptografia.

Em plataformas de computação pessoal, o AIR usa DPAPI no Windows, KeyChain no Mac OS e no iOS e KeyRing ou KWallet no Linux para associar o armazenamento local criptografado a cada aplicativo e usuário. O armazenamento local criptografado usa a criptografia AES-CBC de 128 bits.

No Android, os dados armazenados pela classe EncryptedLocalStorage não são criptografados. Em vez disso, os dados são protegidos pela segurança em nível de usuário fornecida pelo sistema operacional. O sistema operacional Android atribui um ID de usuário separado para cada aplicativo. Os aplicativos podem acessar somente seus próprios arquivos e arquivos criados em locais públicos (tais como cartões de armazenamento removíveis). Observe que nos dispositivos raiz do Android, os aplicativos que operam com privilégios de raiz PODEM acessar os arquivos de outros aplicativos. Dessa forma, em um dispositivo enraizado, o armazenamento local criptografado não fornece um nível muito alto de proteção de dados como ocorre em um dispositivo não-enraizado.

As informações no armazenamento local criptografado estão disponíveis apenas a conteúdo de aplicativos AIR na caixa de proteção de segurança do aplicativo.

Se você atualizar um aplicativo do AIR, a versão atualizada mantém o acesso dos dados existentes no armazenamento local criptografado, a não ser que:

  • Itens adicionados com o parâmetro stronglyBound definido em true

  • As versões existentes e atualizadas são publicadas com antecedência no AIR 1.5.3 e a atualização é assinada com uma assinatura de migração.

Limitações do armazenamento local criptografado

Os dados no armazenamento local criptografado são protegidos pelas credenciais da conta de sistema operacional do usuário. Outras entidades não podem acessar os dados no armazenamento a menos que possam fazer login como aquele usuário. No entanto, os dados não ficam protegidos contra o acesso de outros aplicativos executados por um usuário autenticado.

Como o usuário deve ser autenticado para que esses ataques funcionem, os dados privados do usuário ainda estão protegidos (a menos que a própria conta do usuário esteja comprometida). No entanto, os dados que o seu aplicativo deseja manter em segredo, como as chaves usadas para licenciamento ou o gerenciamento de direitos digitais, não estão seguros. Assim, o ELS não é um local adequado para armazenar essas informações. Isto é somente um local apropriado para armazenar dados particulares do usuário como, por exemplo, senhas.

Os dados no ELS podem ser perdidos por diversos motivos. Por exemplo, o usuário pode desinstalar o aplicativo e excluir o arquivo criptografado. Ou o ID do publicador pode ser alterado como resultado de uma atualização. Dessa forma, o ELS deve ser tratado como um cache particular e não um armazenamento de dados permanente.

O parâmetro stronglyBound foi descontinuado e não deve ser definido como true . Nenhuma proteção adicional é fornecida aos dados se o parâmetro for definido como true . Ao mesmo tempo, o acesso aos dados é perdido sempre que um aplicativo é atualizado — mesmo se o ID do publicador permanecer o mesmo.

O armazenamento local criptografado poderá ficar mais lento se os dados armazenados excederem 10 MB.

Quando você desinstala um aplicativo do AIR, o desinstalador não exclui os dados armazenados no armazenamento local criptografado.

Melhores práticas

Entre as melhores práticas para usar o ELS estão:

  • Use o ELS para armazenar dados importantes do usuário, como senhas (definindo stronglyBound como false)

  • Não use o ELS para armazenar os segredos dos aplicativos como chaves de DRM ou tokens de licenciamento.

  • Fornece uma forma de seu aplicativo recriar os dados armazenados no ELS se os dados do ELS forem perdidos. Por exemplo, ao solicitar que o usuário digite novamente as credenciais de conta quando necessário.

  • Não utilizar o parâmetro stronglyBound .

  • Se você definir o parâmetro stronglyBound como true , não migre os itens armazenados durante uma atualização. Em vez disso, recrie os dados após a atualização.

  • Somente armazene quantidades relativamente pequenas de dados. Para grandes quantidades de dados, utilize o banco de dados SQL do AIR criptografia.

Inclusão de dados no armazenamento local criptografado

Use o método estático setItem() da classe EncryptedLocalStore para armazenar os dados no armazenamento local. Os dados são armazenados em uma tabela de hash, usando sequências de caracteres como chaves, com os dados armazenados como matrizes de bytes.

Por exemplo, o código a seguir armazena uma sequência de caracteres no armazenamento local criptografado:

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

O terceiro parâmetro do método setItem() , o parâmetro stronglyBound , é opcional. Quando este parâmetro está definido em true , o armazenamento local criptografado associa o item armazenado ao aplicativo aos bits e à assinatura do aplicativo do AIR:

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

Para um item armazenado com stronglyBound definido como true , as chamadas subsequentes a getItem() apenas são bem-sucedidas se o aplicativo do AIR de chamada for idêntico ao aplicativo de armazenamento (se nenhum dado nos arquivos do diretório do aplicativo tiver sido alterado). Se o aplicativo do AIR de chamada for diferente do aplicativo de armazenamento, o aplicativo lançará uma exceção de erro quando você chamar getItem() para um item fortemente ligado. Se você atualizar seu aplicativo, ele não será capaz de ler os dados fortemente ligados previamente gravados no armazenamento local criptografado. A configuração de stronglyBound como true em dispositivos móveis é ignorada; o parâmetro sempre é tratado como false .

Se o parâmetro stronglyBound estiver definido como false (o padrão), só o ID da editora precisa se manter igual para que o aplicativo leia os dados. Os bits do aplicativo podem mudar (e precisam ser atribuídos pelo mesmo editor), mas não precisam ser exatamente os mesmos bits que eram no aplicativo que armazenou os dados. Aplicativos atualizados com o mesmo ID do publicado do original podem continuar a acessar os dados.

Nota: Na prática, configurar stronglyBound para true não adiciona nenhuma proteção adicional aos dados. Um usuário mal intencionado ainda pode alterar um aplicativo para obter acesso a itens gravados no ELS. Além disso, os dados são protegidos de ameaças externas, mesmo se stronglyBound estiver definido em true ou false . Por esses motivos, não encorajamos definir stronglyBound em true .

Acesso aos dados no armazenamento local criptografado

Você pode recuperar um valor do armazenamento local criptografado usando o método EncryptedLocalStore.getItem() , como no seguinte exemplo:

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

Remoção de dados do armazenamento local criptografado

Você pode excluir um valor do armazenamento local criptografado usando o método EncryptedLocalStore.removeItem() , como no seguinte exemplo:

EncryptedLocalStore.removeItem("firstName"); 

Você pode limpar todos os dados do armazenamento local criptografado chamando o método EncryptedLocalStore.reset() , como no seguinte exemplo:

EncryptedLocalStore.reset();