Criptografar um Realm - Kotlin SDK
Nesta página
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 Arquivo de Realm no disco com AES-256 + SHA-2 fornecendo uma chave de criptografia de 64 bytes ao abrir o Realm pela primeira vez.
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.writeCopyTo() método. Consulte Copiar dados para um novo Realm para obter mais informações.
Criptografar um Realm local
Para criptografar um domínio local, passe sua chave de encriptação para a propriedade encryptionKey no RealmConfiguration.Builder() usado para abrir o domínio.
O seguinte código demonstra como gerar uma chave de criptografia e abrir um Realm local criptografado:
// return a random key from the given seed fun getRandomKey(seed: Long? = null): ByteArray { // generate a new 64-byte encryption key val key = ByteArray(64) if (seed != null) { // If there is a seed provided, create a random number with that seed // and fill the byte array with random bytes Random(seed).nextBytes(key) } else { // fill the byte array with random bytes Random.nextBytes(key) } return key } runBlocking { // Create the configuration val config = RealmConfiguration.Builder(setOf(Frog::class)) // Specify the encryption key .encryptionKey(generatedKey) .build() // Open the realm with the configuration val realm = Realm.open(config) Log.v("Successfully opened encrypted realm: ${realm.configuration.name}") }
Criptografar um realm sincronizado
Se o seu aplicativo utilizar Atlas Device Sync, você poderá criptografar um Realm sincronizado, semelhante à criptografia de um Realm local.
Para criptografar um domínio sincronizado, passe sua chave de encriptação para a propriedade encryptionKey no SyncConfiguration.Builder() usado para abrir o domínio.
O seguinte código demonstra como abrir um Realm sincronizado criptografado:
val syncConfig = SyncConfiguration.Builder(user, setOf(Frog::class)) .initialSubscriptions { realm -> add(realm.query<Frog>()) } // Specify the encryption key .encryptionKey(generatedKey) .build() val realm = Realm.open(syncConfig) Log.v("Successfully opened encrypted realm: ${realm.configuration.name}")
Consulte Configurar e abrir um Realm sincronizado - Kotlin SDK para obter mais informações.
Criptografia e Atlas Device Sync
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.
Criptografar metadados de aplicativos
Você também pode criptografar os metadados do App Services App que o Realm armazena no dispositivo.
Para saber mais, consulte Criptografar metadados de apps.
Armazenar & reutilizar chaves
Você deve passar pela mesma chave de encriptação toda vez que abrir o domínio criptografado. 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. Por exemplo, você pode usar o sistema Android Keystore ou Keychain da Apple . É responsabilidade do desenvolvedor garantir que os invasores não possam acessar 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.
Acesso a domínios criptografados a partir de vários processos
Alterado na versão 10,8,0.
Começando com o Realm Kotlin SDK versão 10.8.0, o Realm é compatível com a abertura do mesmo domínio criptografado em vários processos.
Se o seu aplicativo usar o Realm Kotlin SDK versão 10.7.1 ou anterior, tentar abrir um domínio criptografado de vários processos gera esse erro:
Encrypted interprocess sharing is currently unsupported.