La encriptación de disco completo es el proceso de codificación de todos los datos del usuario en un dispositivo Android a través de un clave encriptada. Una vez que el dispositivo se encripta, todos los datos creados por el usuario se encriptado automáticamente antes de confirmarlo en el disco, y todas las lecturas desencriptarlos automáticamente antes de devolverlos al proceso de llamada.
La encriptación de disco completo se introdujo en Android en 4.4, pero Android 5.0 estas nuevas funciones:
- Se creó la encriptación rápida, que solo encripta los bloques utilizados en la partición de datos. para evitar que el primer inicio tarde mucho tiempo. Solo los sistemas de archivos ext4 y f2fs admiten actualmente la encriptación rápida.
- Se agregó el
forceencrypt
fstab para encriptar en el primer inicio. - Se agregó compatibilidad con patrones y encriptación sin contraseña.
- Se agregó almacenamiento con copia de seguridad en hardware de la clave de encriptación mediante Trusted La capacidad de firma del entorno de ejecución (TEE) (por ejemplo, en una zona de confianza). Consulta Almacena la clave encriptada para obtener más información. más detalles.
Precaución: Los dispositivos se actualizaron a Android 5.0 y, luego, encriptado podría volver al estado de no encriptado si restableces la configuración de fábrica. Nuevo Android 5.0 los dispositivos encriptados en el primer inicio no pueden devolverse a un estado desencriptado.
Cómo funciona la encriptación de disco completo de Android
La encriptación de disco completo de Android se basa en dm-crypt
, que es un kernel.
que funciona en la capa del dispositivo de almacenamiento en bloques. Debido a
esto, la encriptación funciona con MultiMediaCard incorporada (eMMC) y
dispositivos Flash similares que se presentan al kernel como bloques
dispositivos. La encriptación no es posible con YAFFS, que se comunica directamente con un
Chip de flash NAND.
El algoritmo de encriptación tiene el formato 128 del Estándar de encriptación avanzada (AES) con el encadenamiento de bloques de cifrado (CBC) y ESSIV:SHA256. La clave maestra se encripta con AES de 128 bits mediante llamadas a la biblioteca de OpenSSL Debes usar 128 bits o más para la clave (con 256 es opcional).
Nota: Los OEM pueden usar 128 bits o más para encriptar la clave maestra.
En la versión de Android 5.0, hay cuatro tipos de estados de encriptación:
- default
- PIN
- contraseña
- patrón
En el primer inicio, el dispositivo crea una clave maestra de 128 bits generada de forma aleatoria. y genera un hash con una contraseña predeterminada y la sal almacenada. La contraseña predeterminada es: "default_password". Sin embargo, el hash resultante también se firma a través de un TEE (como TrustZone). que usa un hash de la firma para encriptar la clave maestra.
Puedes encontrar la contraseña predeterminada que se definió en el Proyecto de código abierto de Android cryptfs.cpp. .
Cuando el usuario establece el PIN, el pase o la contraseña en el dispositivo, solo se usará la clave de 128 bits se vuelve a encriptar y se almacena. (p. ej., los cambios de PIN, pase o patrón del usuario NO provocan volver a encriptar los datos del usuario). Ten en cuenta que dispositivo administrado pueden estar sujetos a restricciones de PIN, patrón o contraseña.
init
y vold
administran la encriptación.
init
llama a vold
y vold establece propiedades para activar.
eventos en init. Otras partes del sistema
también pueden observar las propiedades para realizar tareas
como informar el estado, solicitar
contraseña o solicitar que restablezca la configuración de fábrica en caso de un error fatal. Para invocar
funciones de encriptación en vold
, el sistema usa la herramienta de línea de comandos
Comandos cryptfs
de vdc
: checkpw
,
restart
, enablecrypto
y changepw
cryptocomplete
, verifypw
, setfield
,
getfield
, mountdefaultencrypted
, getpwtype
getpw
y clearpw
.
Para encriptar, desencriptar o limpiar /data
, /data
no debe estar montado. Sin embargo, para mostrar cualquier interfaz de usuario (IU), el
El framework debe iniciarse y este requiere /data
para ejecutarse. Para
resolver este problema, se monta un sistema de archivos temporal en /data
.
Permite que Android solicite contraseñas, muestre el progreso o sugiera datos
limpiar según sea necesario. No impone la limitación de que, para pasar del
sistema de archivos temporal al verdadero sistema de archivos /data
, el sistema debe
detener todos los procesos con archivos abiertos en el sistema de archivos temporal y reiniciarlos
procesos en el sistema de archivos /data
real. Para ello, todos los servicios
debe estar en uno de estos tres grupos: core
, main
y
late_start
core
: Nunca se debe apagar después de iniciar.main
: Cierra y, luego, reinicia después de ingresar la contraseña del discolate_start
: No se inicia hasta después de que se haya desencriptado y activado/data
.
Para activar estas acciones, la propiedad vold.decrypt
se establece en
diversas cadenas.
Para finalizar y reiniciar servicios, los comandos de init
son los siguientes:
class_reset
: Detiene un servicio, pero permite que se reinicie con class_start.class_start
: Reinicia un servicio.class_stop
: Detiene un servicio y agrega una marcaSVC_DISABLED
. Los servicios detenidos no responden aclass_start
.
Flujos
Existen cuatro flujos para un dispositivo encriptado. Un dispositivo se encripta solo una vez y, luego, sigue un flujo de inicio normal.
- Encripta un dispositivo que no estaba encriptado:
- Encriptar un dispositivo nuevo con
forceencrypt
: Encriptación obligatoria durante el primer inicio (a partir de Android L). - Encriptar un dispositivo existente: Encriptación iniciada por el usuario (Android K y versiones anteriores).
- Encriptar un dispositivo nuevo con
- Inicia un dispositivo encriptado:
- Iniciar un dispositivo encriptado sin contraseña: Se inicia un dispositivo encriptado que No tiene una contraseña establecida (relevante para dispositivos con Android 5.0 y versiones posteriores).
- Iniciar un dispositivo encriptado con una contraseña: Iniciar un dispositivo encriptado que tiene una contraseña establecida.
Además de estos flujos, es posible que el dispositivo no pueda encriptar /data
.
Cada uno de estos flujos se explica en detalle a continuación.
Encripta un dispositivo nuevo con la encriptación forzada
Este es el primer inicio normal para un dispositivo con Android 5.0.
- Detecta el sistema de archivos no encriptado con la marca
forceencrypt
/data
no está encriptado, pero debe estarlo porqueforceencrypt
lo exige. Desactivar/data
. - Comenzar a encriptar
/data
vold.decrypt = "trigger_encryption"
activainit.rc
, lo que provocará quevold
encripte/data
sin contraseña. (No se estableció ninguno, ya que debería ser un dispositivo nuevo). - Activar tmpfs
vold
activa un/data
de tmpfs (mediante las opciones de tmpfs dero.crypto.tmpfs_options
) y establece la propiedadvold.encrypt_progress
en 0.vold
prepara el/data
de tmpfs para iniciar un sistema encriptado y establece la propiedadvold.decrypt
a:trigger_restart_min_framework
- Agrega un marco de trabajo para mostrar el progreso
Como el dispositivo prácticamente no tiene datos para encriptar, la barra de progreso a menudo no aparecen porque la encriptación ocurre muy rápido. Consulta Encripta un dispositivo existente para obtener más opciones detalles sobre la IU de progreso.
- Cuando
/data
esté encriptado, elimina el framework.vold
establecevold.decrypt
entrigger_default_encryption
, que da inicio al serviciodefaultcrypto
. (Esto inicia el siguiente flujo para activar un datos del usuario encriptados de forma predeterminada).trigger_default_encryption
verifica el tipo de encriptación para ver si/data
está encriptado con o sin un contraseña. Debido a que los dispositivos con Android 5.0 se encriptan en el primer inicio, no debería no haber establecido una contraseña Por lo tanto, desencriptamos y activamos/data
. - Montaje
/data
Luego,
init
activa/data
en un RAMDisk de tmpfs con los parámetros que recopila dero.crypto.tmpfs_options
, que se estableció eninit.rc
. - Framework de inicio
vold
establecevold.decrypt
entrigger_restart_framework
, que continúa el inicio habitual el proceso de administración de recursos.
Encripta un dispositivo existente
Esto es lo que sucede cuando encriptas un dispositivo Android K o versiones anteriores sin encriptar dispositivo que se migró a L.
Este proceso lo inicia el usuario y se conoce como “encriptación interna” en el código. Cuando un usuario elige encriptar un dispositivo, la IU se asegura de que el esté completamente cargada y el adaptador de CA esté enchufado, por lo que hay suficiente poder para terminar el proceso de encriptación.
Advertencia: Si el dispositivo se queda sin energía y se apaga antes de terminar encriptación, los datos de archivos quedan parcialmente encriptados. El dispositivo debe cumplir con los siguientes requisitos: restablecer la configuración de fábrica y se perderán todos los datos.
Para habilitar la encriptación local, vold
inicia un bucle para leer cada una
del dispositivo de bloques real y, luego, escribirlo
al dispositivo de bloques criptográficos. vold
comprueba si un sector está en
usar antes de leerlo y escribirlo, lo que hace que
encriptación más rápida en un dispositivo nuevo
que tiene pocos datos o ninguno.
Estado del dispositivo: Establece ro.crypto.state = "unencrypted"
.
y ejecuta el activador on nonencrypted
init
para continuar con el inicio.
- Verificar contraseña
La IU llama a
vold
con el comandocryptfs enablecrypto inplace
. dondepasswd
es la contraseña de la pantalla de bloqueo del usuario. - Elimina el framework
vold
verifica si hay errores, muestra -1 si no puede encriptar y imprime un motivo en el registro. Si puede encriptar, configura la propiedadvold.decrypt
. atrigger_shutdown_framework
. Esto hará queinit.rc
detener servicios en las claseslate_start
ymain
- Crea un pie de página de criptografía
- Cómo crear un archivo de ruta de navegación
- Reiniciar
- Detecta el archivo de ruta de navegación
- Comenzar a encriptar
/data
Luego,
vold
configura la asignación criptográfica, que crea un dispositivo virtual de bloques criptográficos. que se asigna al dispositivo de bloques real, pero que encripta cada sector a medida que está escrito, y desencripta cada sector a medida que se leen. Luego,vold
crea y escribe los metadatos criptográficos. - Mientras se encripta, activa tmpfs
vold
activa un/data
de tmpfs (mediante las opciones de tmpfs). dero.crypto.tmpfs_options
) y establece la propiedad.vold.encrypt_progress
a 0.vold
prepara el tmpfs./data
para iniciar un sistema encriptado y establece la propiedadvold.decrypt
a:trigger_restart_min_framework
- Agrega un marco de trabajo para mostrar el progreso
trigger_restart_min_framework
provoca queinit.rc
inicia la clase de serviciosmain
. Cuando el framework detecte quevold.encrypt_progress
se establece en 0 y abre la barra de progreso. IU, que consulta esa propiedad cada cinco segundos y actualiza una barra de progreso El bucle de encriptación actualizavold.encrypt_progress
cada vez que encripta otro porcentaje de la partición. - Cuando
/data
esté encriptado, actualiza el pie de página de criptomonedasCuando
/data
se encripte correctamente,vold
se borrará la marcaENCRYPTION_IN_PROGRESS
en los metadatos.Cuando el dispositivo se desbloquea correctamente, la contraseña se usa para encriptar la clave maestra y se actualizará el pie de página criptográfico.
Si por algún motivo, falla el reinicio,
vold
establece la propiedad.vold.encrypt_progress
aerror_reboot_failed
y la IU debe mostrar un mensaje en el que se le pida al usuario que presione un botón para reiniciar. No se espera que esto suceda nunca.
Inicia un dispositivo encriptado con encriptación predeterminada
Esto es lo que sucede cuando inicias un dispositivo encriptado sin contraseña. Debido a que los dispositivos con Android 5.0 se encriptan en el primer inicio, no se debería configurar contraseña y, por lo tanto, este es el estado de encriptación predeterminada.
- Detecta
/data
encriptados sin contraseñaDetecta que el dispositivo Android está encriptado porque
/data
no se puede montar, y uno de los marcadoresencryptable
o Se establecióforceencrypt
.vold
establecevold.decrypt
entrigger_default_encryption
, que da inicio a la serviciodefaultcrypto
.trigger_default_encryption
comprueba el tipo de encriptación para ver si/data
está encriptado con o sin una contraseña. - Desencripta /data
Crea el dispositivo
dm-crypt
sobre el dispositivo de almacenamiento en bloques para que el dispositivo está listo para usarse. - Activación de /data
Luego,
vold
activa la partición/data
real desencriptada. y, luego, prepara la nueva partición. Establece la propiedadvold.post_fs_data_done
en 0 y, luego, establecevold.decrypt
atrigger_post_fs_data
. Esto hará que se ejecuteinit.rc
. sus comandospost-fs-data
. Creará los directorios necesarios. o vínculos y, luego, establecevold.post_fs_data_done
en 1.Una vez que
vold
detecta el 1 de esa propiedad, se establece la propiedad.vold.decrypt
a:trigger_restart_framework.
Esto hace queinit.rc
inicie servicios en la clasemain
de nuevo y también iniciar servicios en la claselate_start
por la primera tiempo desde el inicio. - Framework de inicio
Ahora el framework inicia todos sus servicios con el
/data
desencriptado, y el sistema está listo para usarse.
Inicia un dispositivo encriptado sin encriptación predeterminada
Esto es lo que sucede cuando inicias un dispositivo encriptado que tiene una configuración contraseña. La contraseña del dispositivo puede ser un PIN, un patrón o una contraseña.
- Detecta un dispositivo encriptado con una contraseña
Detecta que el dispositivo Android está encriptado porque el parámetro
ro.crypto.state = "encrypted"
vold
establecevold.decrypt
entrigger_restart_min_framework
porque/data
es encriptado con una contraseña. - Activar tmpfs
init
establece cinco propiedades para guardar las opciones de activación iniciales. dado para/data
con parámetros pasados desdeinit.rc
.vold
usa estas propiedades para configurar la asignación criptográfica:ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags
(Número hexadecimal de 8 dígitos ASCII precedido por 0x)
- Inicia el framework para solicitar la contraseña
El framework se inicia y observa que
vold.decrypt
está configurado comotrigger_restart_min_framework
Esto le indica al framework se inicia en un disco/data
de tmpfs y necesita obtener la contraseña del usuario.Sin embargo, primero debe asegurarse de que el disco se encriptó correctamente. Integra envía el comando
cryptfs cryptocomplete
avold
.vold
devuelve 0 si la encriptación se completó correctamente, -1 por error interno, o -2 si no se completó correctamente la encriptación.vold
determina buscando los metadatos criptográficos deCRYPTO_ENCRYPTION_IN_PROGRESS
marca. Si está configurada, el proceso de encriptación se interrumpió y no hay datos utilizables en el dispositivo. Sivold
muestra un error, la IU debe mostrar un mensaje al usuario para reiniciar y restablecer la configuración de fábrica del dispositivo, y otorgar al usuario un botón que debe presionar para hacerlo. - Desencripta datos con contraseña
Una vez que
cryptfs cryptocomplete
funciona correctamente, el framework Se mostrará una IU que solicita la contraseña del disco. La IU verifica la contraseña enviando el comandocryptfs checkpw
avold
Si el botón contraseña sea correcta (lo que se determina activando con éxito el desencriptaste/data
en una ubicación temporal y, luego, lo desactivaste)vold
guarda el nombre del dispositivo de bloques desencriptado en la propiedad.ro.crypto.fs_crypto_blkdev
y muestra el estado 0 a la IU. Si el botón es incorrecta, el resultado es -1 en la IU. - Detén el framework
La IU muestra un gráfico de arranque criptográfico y, luego, llama a
vold
con el comandocryptfs restart
.vold
establece la propiedad.vold.decrypt
portrigger_reset_main
, lo que causainit.rc
para hacerclass_reset main
. Esta acción detendrá todos los servicios en la clase principal, lo que permite que se desactive el/data
de tmpfs. - Montaje
/data
Luego,
vold
activa la partición/data
real desencriptada. y prepara la nueva partición (que quizás nunca se haya preparado si se encriptó con la opción para eliminar datos, que no se admite primero. lanzamiento). Establece la propiedadvold.post_fs_data_done
en 0 y, luego, Configuravold.decrypt
comotrigger_post_fs_data
. Esto provocainit.rc
para ejecutar sus comandospost-fs-data
Ellos crear los directorios o enlaces necesarios y, a continuación, configurarvold.post_fs_data_done
a 1. Una vez quevold
vea el 1 de esa propiedad, establece la propiedadvold.decrypt
entrigger_restart_framework
Esto hace queinit.rc
comience los servicios en la clasemain
nuevamente y también iniciarlos en la claselate_start
por primera vez desde el inicio. - Inicio del marco de trabajo completo
Ahora, el framework inicia todos sus servicios con el
/data
desencriptado. un sistema de archivos, y el sistema está listo para usarse.
Error
Un dispositivo que no se puede desencriptar puede ser erróneo por varias razones. El dispositivo comienza con la serie normal de pasos para iniciar:
- Detecta un dispositivo encriptado con una contraseña
- Activar tmpfs
- Inicia el framework para solicitar la contraseña
Sin embargo, después de abrir el framework, es posible que el dispositivo encuentre algunos errores:
- La contraseña coincide, pero no se pueden desencriptar los datos
- El usuario ingresa una contraseña incorrecta 30 veces
Si no se resuelven estos errores, solicita al usuario que borre la configuración de fábrica:
Si vold
detecta un error durante el proceso de encriptación y si
Aún no se destruyeron datos y el framework está listo; se establecen vold
conjuntos
la propiedad vold.encrypt_progress
a error_not_encrypted
.
La IU le solicita al usuario que reinicie el dispositivo y le envía una alerta sobre el proceso de encriptación
nunca comenzaron. Si el error ocurre luego de que el framework se haya eliminado, pero
antes de que la IU de la barra de progreso esté activa, vold
reiniciará el sistema. Si
falla el reinicio, establece vold.encrypt_progress
en
error_shutting_down
y muestra -1; pero no habrá nada
para detectar el error. No se espera que esto suceda.
Si vold
detecta un error durante el proceso de encriptación, establece
vold.encrypt_progress
a error_partially_encrypted
y devuelve -1. La IU debería mostrar un mensaje que indique la encriptación
y se proporciona un botón para que el usuario restablezca la configuración de fábrica del dispositivo.
Almacena la clave encriptada
La clave encriptada se almacena en los metadatos criptográficos. La copia de seguridad de hardware está implementación con la capacidad de firma del entorno de ejecución confiable (TEE). Anteriormente, encriptamos la clave maestra con una clave que se generaba mediante scrypt a la contraseña del usuario y a la sal almacenada. Para hacer que la clave sea resiliente contra ataques no convencionales, firmamos la clave resultante para extender este algoritmo con una clave de TEE almacenada. La firma resultante se convierte en un de una aplicación más de scrypt. Luego, esta clave se usa para encriptar y desencriptar la clave maestra. Para almacenar esta clave, haz lo siguiente:
- Generar una clave de encriptación de disco (DEK) aleatoria de 16 bytes y una sal de 16 bytes
- Aplica scrypt a la contraseña del usuario y a la sal para producir intermediarios de 32 bytes clave 1 (IK1).
- Pad IK1 con cero bytes al tamaño de la clave privada vinculada al hardware (HBK). En concreto, rellenamos como: 00 || IK1 || 00.00; un byte cero, 32 bytes IK1, 223 cero bytes.
- Firma el IK1 relleno con HBK para producir IK2 de 256 bytes.
- Aplica scrypt a IK2 y sal (la misma sal del paso 2) para producir IK3 de 32 bytes.
- Usa los primeros 16 bytes de IK3 como KEK y los últimos 16 bytes como IV.
- Encriptar DEK con AES_CBC, KEK clave y vector de inicialización IV
Cambia la contraseña
Cuando un usuario elige cambiar o quitar su contraseña en la configuración, la IU envía
el comando cryptfs changepw
a vold
vold
vuelve a encriptar la clave principal del disco con la contraseña nueva.
Propiedades de encriptación
vold
y init
se comunican entre sí mediante
propiedades de configuración. Esta es una lista de las propiedades disponibles para la encriptación.
Propiedades de vold
Propiedad | Descripción |
---|---|
vold.decrypt trigger_encryption |
Encripta la unidad sin contraseña. |
vold.decrypt trigger_default_encryption |
Revisa la unidad para ver si está encriptada sin contraseña.
Si es así, desencripta y actívala.
De lo contrario, configura vold.decrypt como trigger_restart_min_framework. |
vold.decrypt trigger_reset_main |
Se configura mediante vold para apagar la IU que solicita la contraseña del disco. |
vold.decrypt trigger_post_fs_data |
Se establece por vold para preparar /data con los directorios necesarios, et al. |
vold.decrypt trigger_restart_framework |
Se establece por vold para iniciar el framework real y todos los servicios. |
vold.decrypt trigger_shutdown_framework |
Configúralo por vold para cerrar todo el framework y comenzar la encriptación. |
vold.decrypt trigger_restart_min_framework |
Se establece por vold para iniciar la
IU de la barra de progreso para la encriptación
solicitar la contraseña, según
el valor de ro.crypto.state |
vold.encrypt_progress |
Cuando se inicia el framework, Si esta propiedad está configurada, ingresa el modo de IU de la barra de progreso. |
vold.encrypt_progress 0 to 100 |
La IU de la barra de progreso debería mostrar el valor porcentual establecido. |
vold.encrypt_progress error_partially_encrypted |
La IU de la barra de progreso debería mostrar un mensaje que indica que falló la encriptación. le dan al usuario la opción de restablece la configuración de fábrica del dispositivo. |
vold.encrypt_progress error_reboot_failed |
La IU de la barra de progreso debería mostrar un mensaje que indique la encriptación completar y darle al usuario un botón para reiniciar el dispositivo. Este error no se espera que suceda. |
vold.encrypt_progress error_not_encrypted |
La IU de la barra de progreso debería mostrar un mensaje que dice un error no se encriptó ningún dato o perderse y darle al usuario un botón para reiniciar el sistema. |
vold.encrypt_progress error_shutting_down |
La IU de la barra de progreso no se está ejecutando, por lo que no está claro quién responderá a este error. Y nunca debería suceder de todas formas. |
vold.post_fs_data_done 0 |
Establecido por vold justo antes de establecer vold.decrypt
a trigger_post_fs_data . |
vold.post_fs_data_done 1 |
Establecida por init.rc o
init.rc justo después de finalizar la tarea post-fs-data . |
Propiedades init
Propiedad | Descripción |
---|---|
ro.crypto.fs_crypto_blkdev |
Establecido por el comando vold checkpw para su uso posterior
por el comando restart de vold . |
ro.crypto.state unencrypted |
init lo configuró para indicar que este sistema se ejecuta con un dispositivo no encriptado
/data ro.crypto.state encrypted Se estableció por init para que diga
este sistema se ejecuta con un /data encriptado. |
|
Estas cinco propiedades se establecen
init cuando intenta activar /data con parámetros pasados desde
init.rc vold los usa para configurar la asignación criptográfica. |
ro.crypto.tmpfs_options |
Establecido por init.rc con las opciones que init debe usar cuando
activar el sistema de archivos /data de tmpfs. |
Acciones de init
on post-fs-data on nonencrypted on property:vold.decrypt=trigger_reset_main on property:vold.decrypt=trigger_post_fs_data on property:vold.decrypt=trigger_restart_min_framework on property:vold.decrypt=trigger_restart_framework on property:vold.decrypt=trigger_shutdown_framework on property:vold.decrypt=trigger_encryption on property:vold.decrypt=trigger_default_encryption