Criptografar um Realm - Flutter SDK
Nesta página
Visão geral
Você pode criptografar seus domínios para garantir que os dados armazenados no disco não possam ser lidos fora do seu aplicativo. Você criptografa o Realm no disco com AES-256 + SHA-2 fornecendo uma chave de criptografia de 64 bytes ao abrir um Realm.
O Realm criptografa e descriptografa dados de forma transparente com criptografia AES-256 padrão usando os primeiros 256 bits da 512chave de criptografia bits fornecida. O Realm usa os outros 256 bits da 512chave de criptografia de bits para validar a integridade usando um código de autenticação de mensagem baseado em hash (HMAC).
Aviso
Não use hashes criptograficamente fracos para chaves de encriptação de domínio. Para uma segurança ideal, recomendamos gerar chaves de encriptação aleatórias em vez de derivadas.
Observação
Criptografar um Realm em aberto ou copiar domínio não Realm
Você deve criptografar um realm na primeira vez que abri-lo. Se você tentar abrir um realm não criptografado existente usando uma configuração que contém uma chave de encriptação, o Realm exibirá um erro.
Como alternativa, você pode copiar os dados de domínio não criptografados para um novo domínio criptografado usando o método Realm.writeCopy() método. Consulte Copiar dados para um novo Realm para obter mais informações.
Considerações
Veja a seguir os principais impactos a serem considerados ao criptografar um realm.
Armazenamento e reutilização de chaves
Você deve passar a mesma chave de criptografia no Configuration.encryptionKey do realm propriedade toda vez que você abre o domínio. A chave deve ser um 64-byte List<int>
. Para criar uma chave que atenda a essa especificação, a List deve conter exatamente 64 números inteiros e todos os números inteiros devem estar entre 0 e 255.
Se você não fornecer uma chave ou especificar a chave errada para um domínio criptografado, o domínio SDK emitirá um erro.
Os aplicativos devem armazenar a chave de criptografia com segurança, normalmente no armazenamento seguro de chave/valor da plataforma de destino, para que outros aplicativos não possam ler a chave.
Impacto no desempenho
As leituras e gravações em realms criptografados podem ser até 10% mais lentas do que em realms não criptografados.
Criptografia e Atlas Device Sync
Você pode criptografar um realm sincronizado.
O Realm criptografa somente os dados no dispositivo e armazena os dados não criptografados na sua fonte de dados do Atlas. Qualquer usuário com acesso autorizado à fonte de dados do Atlas pode ler os dados, mas o seguinte ainda se aplica:
Os usuários devem ter as permissões de leitura corretas para ler os dados sincronizados.
Os dados armazenados no Atlas são sempre criptografados em nível de volume (disco).
A transferência entre cliente e servidor é sempre totalmente criptografada.
Você também pode ativar o Gerenciamento de chaves de cliente para criptografar os dados armazenados no Atlas usando a chave do seu provedor de nuvem (por exemplo, AWS KMS, Azure Key Vault, Google Cloud KMS).
Se precisar de chaves exclusivas para cada usuário do seu aplicativo, você poderá usar um provedor OAuth ou um dos provedores de autenticação Realm e um trigger de autenticação para criar uma chave 64bits e armazenar essa chave em um objeto de usuário.
Acesso a um Realm criptografado a partir de vários processos
Alterado na versão 1.1.0.
A partir do Realm Flutter SDK versão 1.1.0, O Realm suporta a abertura do mesmo domínio criptografado em vários processos.
Se o seu aplicativo usar o Realm Flutter SDK versão 1.1.0 ou anterior, tentar abrir um Realm criptografado a partir de vários processos gera esse erro:
Encrypted interprocess sharing is currently unsupported.
Exemplo
O seguinte código demonstra como gerar uma chave de encriptação e abrir um realm criptografado:
// Generate encryption key final key = List<int>.generate(64, (i) => Random().nextInt(256)); final encryptedConfig = Configuration.local([Car.schema], // Include the encryption key in the configuration encryptionKey: key); final encryptedRealm = Realm(encryptedConfig);