Menu Docs

Página inicial do DocsDesenvolver aplicaçõesAtlas Device SDKs

Criptografar um Realm - Kotlin SDK

Nesta página

  • Criptografar um Realm local
  • Criptografar um realm sincronizado
  • Criptografia e Atlas Device Sync
  • Criptografar metadados de aplicativos
  • Armazenar & reutilizar chaves
  • Impacto no desempenho
  • Acesso a domínios criptografados a partir de vários processos

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 encriptação bits fornecida. O Realm usa os outros 256 bits da 512chave de encriptação 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 realm. Para uma segurança ideal, recomendamos gerar chaves de encriptação aleatórias em vez de derivadas.

Observação

Criptografar um domínio em aberto ou copiar domínio não criptografado

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 do domínio não criptografados para um novo domínio criptografado usando o método Realm.writeCopyTo() . Consulte Copiar dados para um novo domínio para obter mais informações.

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}")
}

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.

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.

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.

Você deve passar pela mesma chave de encriptação toda vez que abrir o realm criptografado. Se você não fornecer uma chave ou especificar a chave errada para um realm criptografado, o Realm 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.

As leituras e gravações em realms criptografados podem ser até 10% mais lentas do que em realms não criptografados.

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.

← Excluir um domínio - Kotlin SDK