여기 Android 매뉴얼에서 인용하고 있지만 다음과 같습니다.
노트:
내가 사용한 출처는 마시멜로와 직접 관련이 없지만 롤리팝 이상과 관련이 있습니다.
TL : DR
방금 OP의 질문을 해결하겠습니다. 기술적 세부 사항은 다음과 같습니다.
기본 암호화 키는 하드웨어 소스 (TPM과 유사한 칩)와 소스 파일 default_password
에서 정의 된 AOSP의 기본 비밀번호 에서 제공 cryptfs.c
됩니다 (아래 참조).
예. 기본값뿐만 아니라 모든 암호는 키로 만들어지며 TEE라고하는 TPM과 유사한 칩에 저장됩니다 ( "신뢰 된 실행 환경"의 약어, 자세한 내용은 아래 참조).
장치 SoC의 칩에 UART / JTAG 액세스 권한이있는 해커가 기술적으로 TEE 키에 액세스하거나 사용자 지정 커널이이 정보를 해커에게 유출 할 수 있습니다. 음모 이론의 일부 3 글자 대행사는 OEM과 협력하여 생산 장치에 사용되는 이러한 안전하지 않은 커널을 얻을 수 있지만 많은 상점을 세우지는 않을 것입니다. 자세한 내용은이 답변의 마지막 섹션을 참조하십시오.
해커가 키에 액세스하는 것을 막는 유일한 방법은 해커가 수행해야하는 엄청난 노력입니다.
- 펌웨어의 해시 (체크섬) 확인 ( Google에서 "인증 된 부팅" 이라고 함 )은 실제로 기본적으로 Lollipop 이상 (및 JellyBean 4.3부터 사용 가능)에서 커널 모듈에 의해 수행됩니다
dm-verity
. 그러나 이것은 암호화 상태와 무관합니다.
출처 : AOSP 보안 안내서 here .
- 사용자 정의 비밀번호로 시스템을 해독하는 과정에 대해서는 아래를 참조하십시오. 여기서는 사용자 암호가 암호화 키 생성 및 사용과 관련되어 있음을 알려드립니다.
개요
처음 부팅 할 때 장치는 임의로 생성 된 128 비트 마스터 키를 만든 다음 기본 암호와 저장된 솔트로 해시합니다. 기본 암호는 "default_password"입니다. 그러나 결과 해시도 TEE (TrustZone 등)를 통해 서명되며, 서명 해시를 사용하여 마스터 키를 암호화합니다.
Android 오픈 소스 프로젝트 cryptfs.c 파일에 정의 된 기본 비밀번호를 찾을 수 있습니다 .
사용자가 장치에서 PIN / 패스 또는 비밀번호를 설정하면 128 비트 키만 다시 암호화되어 저장됩니다. (즉, 사용자 PIN / 통과 / 패턴 변경으로 인해 사용자 데이터 파티션을 다시 암호화하지 않습니다.)
기본 암호화로 암호화 된 장치 시작
이것은 암호없이 암호화 된 장치를 부팅 할 때 발생합니다. Android 5.0 기기는 처음 부팅 할 때 암호화되므로 비밀번호가 설정되어 있지 않아야하므로 이것이 기본 암호화 상태입니다.
- 비밀번호없이 암호화 된 / 데이터 감지
/ data를 마운트 할 수없고 플래그 중 하나 encryptable
또는 forceencrypt
설정 되어 Android 디바이스가 암호화되어 있는지 감지하십시오 .
vold
설정 vold.decrypt
에 trigger_default_encryption
시작되는, defaultcrypto
서비스. trigger_default_encryption
/ data가 암호를 사용하거나 사용하지 않고 암호화되는지 확인하기 위해 암호화 유형을 확인합니다.
- / 데이터 해독
dm-crypt
장치를 사용할 수 있도록 블록 장치 위에 장치를 만듭니다 .
- 마운트 / 데이터
vold
그런 다음 해독 된 실제 / 데이터 파티션을 마운트 한 다음 새 파티션을 준비합니다. 속성 vold.post_fs_data_done
을 0
로 설정 한 다음로 설정 vold.decrypt
합니다 trigger_post_fs_data
. 이 원인 init.rc
의 실행 post-fs-data
명령을. 필요한 디렉토리 나 링크를 만든 다음로 설정 vold.post_fs_data_done
합니다 1
.
일단 vold
그 속성에 1을보고,이 속성을 설정 vold.decrypt
하려면 다음과 같이하십시오 trigger_restart_framework
. 이로 인해 init.rc
클래스에서 서비스가 main
다시 시작되고 부팅 이후 처음으로 late_start 클래스에서 서비스가 시작됩니다.
- 프레임 워크 시작
이제 프레임 워크는 해독 된 / 데이터를 사용하여 모든 서비스를 부팅하고 시스템을 사용할 수 있습니다.
기본 암호화없이 암호화 된 장치 시작
암호가 설정된 암호화 된 장치를 부팅 할 때 발생합니다. 장치의 비밀번호는 핀, 패턴 또는 비밀번호 일 수 있습니다.
- 비밀번호로 암호화 된 장치 감지
플래그 때문에 안드로이드 장치가 암호화되어 있음을 감지 ro.crypto.state = "encrypted"
vold
/ data가 암호로 암호화 vold.decrypt
되어 trigger_restart_min_framework
있기 때문에로 설정 됩니다 .
- tmpfs 마운트
init
에서 전달 된 매개 변수와 함께 / data에 제공된 초기 마운트 옵션을 저장하기 위해 5 개의 특성을 설정합니다 init.rc
. vold
다음 속성을 사용하여 암호화 매핑을 설정합니다.
ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags
(ASCII 8 자리 16 진수 앞에 0x)
- 비밀번호를 묻는 프레임 워크 시작
프레임 워크가 시작되고 vold.decrypt
로 설정되어 trigger_restart_min_framework
있습니다. 이것은 프레임 워크가 tmpfs /data
디스크에서 부팅되고 있으며 사용자 암호를 가져와야한다는 것을 알려줍니다 .
그러나 먼저 디스크가 올바르게 암호화되었는지 확인해야합니다. 명령 cryptfs cryptocomplete
을에 보냅니다 vold
. vold
암호화가 성공적으로 완료되면 0을, 내부 오류에 -1을, 암호화가 성공적으로 완료되지 않으면 -2를 반환합니다. 플래그 vold
의 암호화 메타 데이터를보고이를 판별합니다 CRYPTO_ENCRYPTION_IN_PROGRESS
. 설정된 경우 암호화 프로세스가 중단되었으며 장치에 사용 가능한 데이터가 없습니다.
경우 vold
반환 오류가, UI를 재부팅하고 사용자에게 메시지를 표시하여 장치를 공장 재설정하고 그렇게 언론에 사용자에게 버튼을 제공합니다.
- 비밀번호로 데이터 해독
일단 cryptfs cryptocomplete
성공, 프레임 워크 디스플레이는 UI는 디스크 암호를 묻는. UI는에 명령 cryptfs checkpw
을 보내서 비밀번호를 확인합니다 vold
. 암호가 올 바르면 (암호 해독 /data
을 임시 위치 에 성공적으로 마운트 한 후 마운트 해제하면 결정됨 ) vold는 암호 해독 된 블록 장치의 이름을 속성에 저장 ro.crypto.fs_crypto_blkdev
하고 상태 0을 UI에 반환합니다. 암호가 틀리면 UI에 -1을 반환합니다.
- 프레임 워크 중지
UI는 암호화 부팅 그래픽을 표시 한 다음 명령을 사용하여 vold를 호출합니다 cryptfs restart
. vold
속성 설정 vold.decrypt
을 trigger_reset_main
야기 init.rc
할을 class_reset main
. main
클래스의 모든 서비스가 중지 tmpfs /data
되어 마운트를 해제 할 수 있습니다.
- 마운트 / 데이터
vold
그런 다음 해독 된 실제 /data
파티션 을 마운트하고 새 파티션을 준비합니다 (처음 릴리스에서 지원되지 않는 삭제 옵션으로 암호화 된 경우 아직 준비되지 않았을 수 있음). 속성 vold.post_fs_data_done
을 0
로 설정 한 다음로 설정 vold.decrypt
합니다 trigger_post_fs_data
. 이로 인해이 ( init.rc
가) 실행 post-fs-data commands
됩니다. 필요한 디렉토리 나 링크를 만든 다음로 설정 vold.post_fs_data_done
합니다 1
. 일단 vold
를보고 1
해당 속성에, 그것은 속성 설정 vold.decrypt
에를 trigger_restart_framework
. 이로 인해 init.rc
클래스에서 서비스가 main
다시 시작 late_start
되고 부팅 이후 처음으로 클래스에서 서비스가 시작됩니다 .
- 전체 프레임 워크 시작
이제 프레임 워크는 해독 된 / data 파일 시스템을 사용하여 모든 서비스를 부팅하고 시스템을 사용할 수 있습니다.
암호화 된 키 저장
암호화 된 키는 암호화 메타 데이터에 저장됩니다. 하드웨어 백업은 TEE (Trusted Execution Environment) 서명 기능을 사용하여 구현됩니다. 이전 scrypt
에는 사용자 비밀번호와 저장된 솔트 에 적용 하여 생성 된 키로 마스터 키를 암호화했습니다 .
오프 박스 공격에 대해 키를 복원력있게 만들기 위해 저장된 TEE 키로 결과 키에 서명하여이 알고리즘을 확장합니다. 그런 다음 결과 시그니처는를 한 번 더 적용하여 적절한 길이의 키로 바뀝니다 scrypt
. 그런 다음이 키는 마스터 키를 암호화하고 해독하는 데 사용됩니다. 이 키를 저장하려면
- 임의의 16 바이트 디스크 암호화 키 (DEK) 및 16 바이트 솔트를 생성하십시오.
scrypt
32 바이트 중간 키 1 (IK1)을 생성하려면 사용자 비밀번호와 솔트에 적용하십시오 .
- 하드웨어 바인딩 개인 키 (HBK) 크기에 0 바이트의 IK1을 채 웁니다. 구체적으로 다음과 같이 채 웁니다. 00 || IK1 || 00..00; 하나의 0 바이트, 32 IK1 바이트, 223 0 바이트.
- 256 바이트 IK2를 생성하기 위해 HBK로 IK1을 부호로 채워 넣습니다.
- 적용
scrypt
32 바이트 IK3 생산 IK2 염화칼슘 (2 단계와 같은 염)에 관한 것이다.
- IK3의 처음 16 바이트를 KEK로 사용하고 마지막 16 바이트를 IV로 사용하십시오.
- 키 KEK 및 초기화 벡터 IV를 사용하여 AES_CBC로 DEK를 암호화하십시오.