Puedes cifrar tus dominios para garantizar que los datos almacenados en el disco no se puedan leer fuera de tu aplicación. Cifra el archivo del dominio en el disco con AES-256 + SHA-2 proporcionando una 64clave de cifrado de bytes al abrir el dominio por primera vez.
Realm cifra y descifra datos de forma transparente con estándares Cifrado AES-256Utilizando los primeros 256 bits de la clave de cifrado de bits 512dada. Realm utiliza los otros 256 bits de la 512clave de cifrado de bits para validar la integridad mediante un código de autenticación de mensajes basado en hash (HMAC).
Advertencia
No utilice hashes criptográficamente débiles para las claves de cifrado de dominio. Para una seguridad óptima, recomendamos generar claves de cifrado aleatorias en lugar de derivadas.
Nota
Encripta un Realm al abrir o copia un Realm sin cifrar
Debes cifrar un dominio la primera vez que lo abras. Si intentas abrir un dominio existente sin cifrar con una configuración que contiene una clave de cifrado, Realm generará un error.
Como alternativa, puede copiar los datos del dominio sin cifrar a un nuevo dominio cifrado mediante el método Realm.writeCopyTo(). Consulte Copiar datos a un nuevo dominio para obtener más información.
Cifrar un dominio local
Para cifrar un reino local, pase su clave de cifrado a la propiedad encryptionKey en RealmConfiguration.Builder() utilizada para abrir el reino.
El siguiente código demuestra cómo generar una clave de cifrado y abrir un dominio local cifrado:
// 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}") }
Cifrar un dominio sincronizado
Si tu aplicación utiliza Atlas Device Sync, puedes cifrar un realm sincronizado, similar a cifrar un realm local.
Para cifrar un reino sincronizado, pase su clave de cifrado a la propiedad encryptionKey en SyncConfiguration.Builder() utilizado para abrir el reino.
El siguiente código demuestra cómo abrir un reino sincronizado cifrado:
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}")
Consulta Configurar y abrir un reino sincronizado - Kotlin SDK para obtener más información.
Cifrado y sincronización de dispositivos Atlas
Realm solo cifra los datos del dispositivo y los almacena sin cifrar en la fuente de datos Atlas. Cualquier usuario con acceso autorizado a la fuente de datos Atlas puede leerlos, pero se aplica lo siguiente:
Los usuarios deben tener los permisos de lectura correctos para leer los datos sincronizados.
Los datos almacenados en Atlas siempre están cifrados a nivel de volumen (disco).
La transferencia entre el cliente y el servidor siempre está totalmente cifrada.
También puede habilitar la Administración de claves del cliente para cifrar los datos de Atlas almacenados utilizando la clave de su proveedor de nube (por ejemplo, AWS KMS, Azure Key Vault, Google Cloud KMS).
Si necesita claves únicas para cada usuario de su aplicación, puede utilizar un proveedor OAuth o utilizar uno de los proveedores de autenticación de Realm y un activador de autenticación para crear 64una clave de bits y almacenar esa clave en un objeto de usuario.
Encriptar Metadatos de la aplicación
También puedes cifrar los metadatos de la aplicación App Services que Realm almacena en el dispositivo.
Para obtener más información, consulte Cifrar metadatos de la aplicación.
Guardar y reutilizar llaves
Debes pasar la misma clave de cifrado cada vez que abras el dominio cifrado. Si no proporcionas una clave o especificas una incorrecta para un dominio cifrado, el SDK de Realm generará un error.
Las aplicaciones deben almacenar la clave de cifrado de forma segura, generalmente en el almacenamiento seguro de clave-valor de la plataforma de destino, para que otras aplicaciones no puedan leerla. Por ejemplo, se puede usar el sistema de almacén de claves de Android o el llavero de Apple. Es responsabilidad del desarrollador garantizar que los atacantes no puedan acceder a la clave.
Impacto en el rendimiento
Las lecturas y escrituras en reinos cifrados pueden ser hasta un 10% más lentas que en reinos no cifrados.
Acceda a dominios cifrados desde múltiples procesos
Cambiado en la versión 10.8.0.
A partir de la versión 10.8.0 del SDK de Realm Kotlin, Realm admite la apertura del mismo reino cifrado en múltiples procesos.
Si su aplicación usa la versión 10.7.1 o anterior del SDK de Kotlin de Realm, intentar abrir un reino cifrado desde varios procesos arroja este error:
Encrypted interprocess sharing is currently unsupported.