Full-disk Encryption は、Android デバイス上のすべてのユーザー データを暗号化キーを使用してエンコードする処理です。 デバイスが暗号化されると、ユーザーが作成したすべてのデータは、ディスクにコミットする前に自動的に暗号化され、すべての読み取りは、呼び出しプロセスにデータを返す前に自動的に復号化されます。
フルディスク暗号化は 4.4 で Android に導入されましたが、Android 5.0 ではこれらの新機能が導入されました:
- 高速暗号化は、最初の起動時間が長くなるのを避けるためにデータ パーティションの使用ブロックのみを暗号化して作成されました。 現在、ext4 および f2fs ファイルシステムのみが高速な暗号化をサポートしています。
- 初回起動時に暗号化するための
forceencrypt
fstab フラグを追加しました。 - パスワードなしのパターンと暗号化のサポートを追加しました。
- Trusted Execution Environment (TEE) の署名機能 (TrustZone など) を使用した、暗号化キーのハードウェアバックアップされたストレージを追加しました。 詳しくは、暗号化キーの保存を参照してください。
注意。 注意:Android 5.0にアップグレードして暗号化されたデバイスは、工場出荷時のデータリセットにより暗号化されていない状態に戻る可能性があります。
How Android full-disk encryption works
Android full-disk encryption is based on dm-crypt
, which is a kernelfeature that works at the block device layer. このため、暗号化は、ブロックデバイスとしてカーネルに自分自身を提示Embedded MultiMediaCard(eMMC)とsimilarフラッシュデバイスで動作します。 暗号化は、rawNANDフラッシュチップと直接対話するYAFFSでは不可能です。
暗号化アルゴリズムは128 Advanced Encryption Standard (AES) withcipher-block chaining (CBC) and ESSIV:SHA256を使用します。 マスターキーは、OpenSSLライブラリの呼び出しにより128ビットAESで暗号化されます。 鍵は128ビット以上を使用する必要があります(256ビットはオプション)。
Note: OEM はマスター キーを暗号化するのに 128 ビット以上を使用できます。
- デフォルト
- ピン
- パスワード
- パターン
最初の起動時に、デバイスはランダムに生成された128ビットマスターキーを作り、デフォルトパスワードと保存されているソルトでハッシュ化します。 デフォルトのパスワードは「default_password」ですが、結果のハッシュは TEE (TrustZone など) を通して署名され、署名のハッシュを使用してマスター キーを暗号化します。
デフォルトパスワードは、Android オープン ソース プロジェクト cryptfs.cppfile に定義されています。 (つまり、ユーザーのPIN/パス/パターンの変更は、ユーザーデータの再暗号化を引き起こしません。) 管理されたデバイスは、PIN、パターン、またはパスワードの制限の対象となる可能性があることに注意してください。 システムの他の部分は、ステータスの報告、パスワードの要求、致命的なエラーの場合の工場出荷時のプロンプトなどのタスクを実行するために、プロパティも参照します。 vold
の暗号化機能を呼び出すために、システムはコマンドライン・ツールvdc
のcryptfs
コマンドを使用します。 checkpw
,restart
,enablecrypto
,changepw
,cryptocomplete
,verifypw
,setfield
,getfield
,mountdefaultencrypted
,getpwtype
,getpw
,clearpw
.
暗号化、復号、ワイプするには /data
をマウントしてはいけない。 しかし、ユーザー インターフェイス (UI) を表示するには、フレームワークが起動し、フレームワークが /data
を実行する必要があります。 この難問を解決するために、一時ファイルシステムを/data
にマウントします。これにより、Androidは必要に応じてパスワードを要求したり、進捗状況を表示したり、データ消去を提案したりすることができます。 しかし、一時ファイルシステムから本当の/data
ファイルシステムに切り替えるために、システムは一時ファイルシステム上でファイルを開いているすべてのプロセスを停止し、本当の/data
ファイルシステム上でそれらのプロセスを再起動しなければならないという制限を課せられています。 これを行うには、すべてのサービスが3つのグループのいずれかに属している必要があります。
-
core
: 起動後にシャットダウンしない。 -
main
: シャットダウンし、ディスクパスワード入力後に再起動します。 -
late_start
:
これらのアクションをトリガするために、vold.decrypt
プロパティに様々な文字列が設定されます。
class_start
: サービスを再起動します。 class_stop
: サービスを停止し、SVC_DISABLED
フラグを追加します。 停止したサービスはclass_start
に応答しません。フロー
暗号化されたデバイスには、4つのフローが存在します。 デバイスは一度だけ暗号化され、その後は通常のブートフローをたどります。
- 以前に暗号化されていないデバイスを暗号化する。
-
forceencrypt
で新しいデバイスを暗号化します。 最初のブート時に暗号化を必須とする (Android L から)。 - 既存のデバイスを暗号化します。 ユーザー主導の暗号化 (Android K およびそれ以前)。
-
- 暗号化されたデバイスをブートします。
- Starting an encrypted device with no password: パスワードが設定されていない暗号化デバイスを起動する (Android 5.0 以降のデバイスに関連)。
- Starting an encrypted device with a password: セットされたパスワードを持つ暗号化されたデバイスを起動します。
これらのフローに加えて、デバイスが暗号化に失敗することもあります
/data
。それぞれのフローを以下に詳しく説明します。Encrypt a new device with forceencrypt
これは Android 5.0 の通常の最初のブートにあたります。
- Detect unencrypted filesystem with
forceencrypt
flag/data
is not encrypted but needs to be becauseforceencrypt
mandates it.Unmount/data
.This is normal first boot for Android 5.0 device.- Detect unencrypted filesystem with
forceencrypt
flag/data
withforceencrypt
commandes. -
/data
vold.decrypt = "trigger_encryption"
の暗号化を開始すると、init.rc
が起動し、vold
がパスワードなしで/data
を暗号化します (新しいデバイスであるため None が設定されています。)。) - Mount tmpfs
vold
は tmpfs/data
をマウントし (ro.crypto.tmpfs_options
の tmpfs オプションを使用)、プロパティvold.encrypt_progress
を 0 に設定します。vold
は暗号化されたシステムを起動するために tmpfs/data
を準備し、プロパティvold.decrypt
を設定します。trigger_restart_min_framework
- Bring up framework to show progress
デバイスには暗号化するデータがほとんどないため、暗号化が非常に速く行われるため、プログレスバーが実際に表示されないことがよくあります。
-
/data
が暗号化されたら、フレームワークを停止してvold
vold.decrypt
をtrigger_default_encryption
に設定し、defaultcrypto
サービスを開始します。 (trigger_default_encryption
は/data
がパスワード付きで暗号化されているか、パスワードなしで暗号化されているかを確認するために、暗号化のタイプをチェックします。 Android 5.0 デバイスは初回起動時に暗号化されるため、パスワードは設定されていないはずです。したがって、復号化して/data
をマウントします。 - Mount
/data
init
は、/data
を tmpfs RAMDisk 上にマウントし、ro.crypto.tmpfs_options
から拾ったパラメーターはinit.rc
で設定されているものとします。 - Start framework
Set
vold
totrigger_restart_framework
, whichcontontinue the usual boot process.これは、通常のブートプロセスを継続します。
Encrypt an existing device
L に移行された暗号化されていない Android K 以前のデバイスを暗号化すると、このようなことが起こります。 ユーザーがデバイスの暗号化を選択すると、UIはthebatteryが完全に充電され、ACアダプタが接続されていることを確認し、暗号化プロセスを完了するのに十分な電力があることを確認します。 警告: 暗号化が完了する前にデバイスの電源が切れ、シャットダウンした場合、ファイル データは部分的に暗号化された状態で残ります。
インプレース暗号化を有効にするには、
vold
ループを開始し、リアルブロックデバイスの各セクタを読み取り、それを暗号ブロックデバイスに書き込むようにします。vold
では、読み書きの前にセクタが使用中であるかどうかを確認するため、データがほとんどない新しいデバイスでも暗号化を高速に実行できます。デバイスの状態。
- Check password
UI はコマンド
cryptfs enablecrypto inplace
でvold
を呼び出し、passwd
はユーザーのロック画面のパスワードです。 - Take down the framework
vold
はエラーがないかチェックし、暗号化できない場合は -1を返し、ログに理由を記録します。 暗号化できる場合は、プロパティvold.decrypt
をtrigger_shutdown_framework
に設定する。 これにより、init.rc
はクラスlate_start
とmain
のサービスを停止させる。 - 暗号フッターの作成
- パンくずファイルの作成
- 再起動
- パンくずファイルの検出
- 暗号化の開始
/data
vold
次に暗号マッピングをセットアップする。 これは、実際のブロックデバイスにマッピングする仮想の暗号ブロックデバイスを作成するが、書き込む際に各セクタを暗号化し、読み込む際に各セクタを復号化するものである。vold
は、暗号化メタデータを作成し、書き出します。 - 暗号化中に、mount tmpfs
vold
は tmpfs/data
をマウントし (ro.crypto.tmpfs_options
の tmpfs オプションを使用)、プロパティvold.encrypt_progress
を 0 に設定します。vold
では暗号化システムのブートに備えて tmpfs/data
を用意し、プロパティvold.decrypt
に設定しています。trigger_restart_min_framework
- Bring up framework to show progress
trigger_restart_min_framework
causesinit.rc
to start themain
class of services.を起動します。 暗号化ループは、パーティションの別のパーセントを暗号化するたびにvold.encrypt_progress
を更新します。 - When
/data
is encrypted, update the crypto footerWhen
/data
is successfully encrypted,vold
clearsthe the flagENCRYPTION_IN_PROGRESS
in the metadata.デバイスのロック解除に成功すると、パスワードがマスターキーの暗号化に使用され、crypto footerが更新されます。
何らかの理由で再起動に失敗すると、
vold
はプロパティvold.encrypt_progress
をerror_reboot_failed
に設定して、UIに再起動するためのボタンをユーザーに押すように求めるメッセージが表示されるはずです。 Android 5.0 デバイスは初回起動時に暗号化されるため、パスワードの設定はないはずで、したがって、これがデフォルトの暗号化状態です。- Detect encrypted
/data
with no passwordDetect the Android device is encrypted because
/data
annot be mounted and one of the flagsencryptable
orforceencrypt
is set.vold
setsvold.decrypt
totrigger_default_encryption
, which starts thedefaultcrypto
service.Detect the Android devices with no password.Detect the Android devices is encrypted.trigger_default_encryption
は暗号化のタイプをチェックし、/data
がパスワード付きかパスワードなしかを確認する。 - Decrypt /data
Creates the
dm-crypt
device over the block device so the device is ready for use. - Mount /data
vold
then mount the decrypted real/data
partition and then prepares the new partition.これは、暗号化解除された本物の/data
パーティションをマウントし、新たなパーティションを準備します。 プロパティ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
クラスのサービスも開始します。 - Start framework
これで、フレームワークは復号された
/data
を使用してすべてのサービスを起動し、システムは使用できるようになりました。
Starting an encrypted device without default encryption
setpassword を持つ暗号化デバイスを起動すると、このようなことが起こります。 デバイスのパスワードは、ピン、パターン、またはパスワードです。
- Detect encrypted device with a password
Detect that the Android device is encrypted because the flag
ro.crypto.state = "encrypted"
vold
setsvold.decrypt
totrigger_restart_min_framework
because/data
isencrypted with a password. - Mount tmpfs
init
sets five properties to save the initial mount optionsgiven for/data
with parameters passed frominit.rc
.This is what happens to boot up the encrypted device with password.vold
はこれらのプロパティを使用して、暗号マッピングを設定します。-
ro.crypto.fs_type
-
ro.crypto.fs_real_blkdev
-
ro.crypto.fs_mnt_point
-
ro.crypto.fs_options
-
ro.crypto.fs_flags
(0x で始まる8桁の16進数)
-
- Start framework to prompt for password
framework が起動すると
vold.decrypt
がtrigger_restart_min_framework
と設定されていることが確認できます。 これは、フレームワークが tmpfs/data
ディスク上で起動しており、ユーザーパスワードを取得する必要があることを伝えます。しかしながら、最初に、ディスクが適切に暗号化されていることを確認する必要があります。
vold
は暗号化が正常に完了した場合は0、内部エラーの場合は-1、暗号化が正常に完了しなかった場合は-2を返します。vold
は、暗号化メタデータでCRYPTO_ENCRYPTION_IN_PROGRESS
フラグを検索することでこれを判断します。 設定されている場合、暗号化プロセスは中断され、デバイスにネーザブルなデータが存在する。vold
がエラーを返した場合、UI はユーザーにデバイスの再起動と工場出荷時のリセットを促すメッセージを表示し、そのために押すボタンを表示します。 - Decrypt data with password
cryptfs cryptocomplete
が成功すると、ディスクパスワードを要求する UI がフレームワークに表示されます。 UIはcryptfs checkpw
からvold
にコマンドを送信してパスワードを確認する。 パスワードが正しい場合(暗号化された/data
を一時的にマウントし、その後アンマウントすることで判断されます)、vold
は暗号化解除されたブロックデバイスの名前をプロパティro.crypto.fs_crypto_blkdev
に保存し、ステータス0をUIに返します。 - Stop framework
UIは、暗号ブートグラフィックを表示し、コマンド
cryptfs restart
でvold
を呼び出します。vold
はプロパティvold.decrypt
をtrigger_reset_main
に設定し、init.rc
にclass_reset main
を実行させます。 これにより、メイン・クラスのすべてのサービスが停止し、tmpfs/data
がアンマウントされるようになりました。 - Mount
/data
vold
は、暗号化されていない本当の/data
パーティションをマウントし、新しいパーティション (firstrelease ではサポートされていない wipe オプションで暗号化されていた場合は準備されていなかったかもしれません) を用意します。 プロパティ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
のサービスも開始します。 - Start full framework
これで、フレームワークは復号化された
/data
ファイルシステムを使用してすべてのサービスを起動し、システムを使用する準備ができました。
Failure
復号化に失敗したデバイスは、いくつかの理由で異常が発生している可能性があります。
- Detect encrypted device with a password
- Mount tmpfs
- Start framework to prompt for password
しかし、フレームワークを開いた後、デバイスはいくつかのエラーに遭遇する可能性があります。
- Password matches but cannot decrypt data
- User enters wrong password 30 times
If these errors are not resolved, prompt user to factory wipe:
If
vold
detect an error during encryption process, and if no data has been destroyed yet and the framework is up,vold
setsthe propertyvold.encrypt_progress
toerror_not_encrypted
.UI はユーザーに再起動を促し、暗号化プロセスが開始されないことを警告します。 フレームワークが破壊された後、プログレスバー UI が表示される前にエラーが発生した場合、vold
はシステムを再起動します。 再起動に失敗すると、vold.encrypt_progress
にerror_shutting_down
を設定し、-1 を返しますが、エラーをキャッチするものはありません。vold
が暗号化処理中にエラーを検出した場合、vold.encrypt_progress
にerror_partially_encrypted
を設定し、-1 を返します。 UI は、暗号化に失敗したというメッセージを表示し、ユーザーがデバイスを工場出荷時にリセットするためのボタンを提供する必要があります。暗号化キーの保存
暗号化キーは、cryptoメタデータに保存されます。 ハードウェアによるバックアップは、Trusted Execution Environment(TEE)の署名機能を使用して実装されています。以前は、ユーザーのパスワードと保存されているソルトにscryptを適用して生成したキーでマスターキーを暗号化しました。 オフボックス攻撃に耐える鍵にするため、このアルゴリズムを拡張し、結果の鍵に保存されたTEE鍵で署名する。 署名の結果は、scryptをもう1回適用することで、適切な長さの鍵に変換されます。 この鍵は、マスターキーの暗号化および復号化に使用される。 この鍵は、
- ランダムな16バイトのディスク暗号化キー(DEK)と16バイトのソルトを生成することで保存されます。
- ユーザーパスワードとソルトにscryptを適用して、32バイトの中間鍵1(IK1)を生成します。
- IK1をハードウェア結合秘密鍵(HBK)のサイズに0バイトでパッドする。具体的には、次のようにパッドする。 00 || IK1 || 00..00; 1つのゼロ・バイト、32 IK1バイト、223ゼロ・バイト。
- IK1をHBKでパディングし、256バイトのIK2を生成することに署名します。
- IK2にscryptを適用し、ソルト(ステップ2と同じソルト)を適用して、32バイトのIK3を生成します。
- IK3の最初の16バイトをKEKとして、最後の16バイトをIVとして使用します。
- 鍵KEKと初期化ベクトルIVを使用して、AES_CBCでDEKを暗号化します。
パスワードの変更
ユーザーが設定のパスワードを変更または削除することを選択すると、UIはコマンド
cryptfs changepw
をvold
に送り、vold
は新しいパスワードでディスクマスターキーを再暗号化します。Encryption properties
vold
とinit
は、プロパティを設定することによって相互に通信します。 以下は、暗号化に使用できるプロパティのリストです。Vold properties
プロパティ 説明 vold.decrypt trigger_encryption
パスワードなしでドライブを暗号化する。vold.decrypt を trigger_restart_min_framework に設定します。 vold.decrypt trigger_reset_main
ディスクパスワードを要求するUIをシャットダウンするようにvoldが設定。 vold.decrypt trigger_restart_framework
実際のフレームワークとすべてのサービスを開始するためにvoldによって設定されます。 vold.decrypt trigger_shutdown_framework
暗号化を開始するためにフレームワークを完全にシャットダウンするためにvoldによって設定されます。 vold.decrypt trigger_restart_min_framework
Vold により、 ro.crypto.state
の値に応じて、暗号化のためのプログレスバー UI またはパスワードのプロンプトを開始するように設定されます。vold.encrypt_progress
このプロパティが設定されている場合、フレームワークの起動時にプログレスバーUIモードを開始します。 vold.encrypt_progress 0 to 100
プログレスバーUIには設定されたパーセント値が表示されるはずです。 vold.encrypt_progress error_partially_encrypted
The progress bar UI should display the message that the encryption failed, and give the option to factory reset the device. vold.encrypt_progress error_reboot_failed
The progress bar UI should display the message that encryption completed, and give the button to reboot the device.
UI that the progress bar UI to the encryption completed and give the option to device… UI to factory reset the devices… vold.encrypt_progress error_not_encrypted
The progress bar UI should display a message saying an erroroccurred, no data was encrypted orlost, and give the button to reboot system. vold.encrypt_progress error_shutting_down
The progress bar UI is not running, so who will respond to this error is unclear.
The progress bar UI is not running, and the user is for the button to reboot system. そして、いずれにせよ絶対にあってはならないことです。 vold.post_fs_data_done 0
タスク vold.decrypt
をtrigger_post_fs_data
に設定する直前にvold
で設定。vold.post_fs_data_done 1
タスク post-fs-data
終了後にinit.rc
かinit.rc
で設定。init properties
Property Description ro.crypto.fs_crypto_blkdev
vold
コマンドcheckpw
によって、後のvold
コマンドrestart
で使うためにセットされる。ro.crypto.state unencrypted
このシステムが暗号化されていない /data ro.crypto.state encrypted
で動作しているとinit
により設定される。 2026>ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flagsこれら5つのプロパティは、 init
がinit.rc
から渡されたパラメータで/data
をマウントしようとする際に設定されます。vold
はこれらを使用して暗号マッピングを設定します。ro.crypto.tmpfs_options
tmpfs /data
ファイルシステムのマウント時に使用するオプションをinit.rc
が設定します。Init アクション
- Detect encrypted
- Detect unencrypted filesystem with