Androidはフルディスク暗号化を使用してファイルを暗号化し、起動時にそれらを復号化します。私が理解していないことは、ストレージのすべてのコンテンツを読み取るのに必要なIOアクセス時間以上でなければ、数ギガバイトのファイルの復号化には長い時間がかかることですが、Androidはわずか数秒で起動します。これはどのようにして可能ですか?
暗号化はディスクではなくメモリで行われます
ディスク暗号化のしくみを誤解しています。ディスク全体を読み取って、復号化されたバージョンで置き換えることはありません。むしろ、暗号化されたデータのファイルまたはセクターがアクセスされると、それらはメモリに読み込まれ、メモリ内で復号化されます。同様に、ディスクに書き込む場合、データは永続的なストレージに保存される前にメモリ内で暗号化されます。オペレーティングシステムは、パフォーマンスの最適化として、読み取られたデータまたはメモリ(ファイルシステムバッファ)に書き込まれるデータのコピーを保持します。暗号化と復号化が行われるのはこのメモリ内です。これにより、データをディスクから読み取って一度復号化することができますが、その後、メモリから何度もアクセスできます。ちなみに、頻繁にアクセスされるファイルを格納するためにメモリを使用するのは、 LinuxがRAMを大量に消費する )と誤って考える人が多いためです。
また、ボトルネックは暗号化ではなくI/Oであることが多いことも指摘しておきます。ギガバイトのデータの暗号化には時間がかかると言われていますが、最近のほとんどのマシン(モバイルデバイスを含む)では、ギガバイトのデータの暗号化には数秒しかかかりません(特にハードウェアアクセラレーションでは、暗号化は本当に本当に速い)。ただし、最新のソリッドステートドライブAndroidデバイスは、ほぼこれらの速度でデータを読み書きすることができません。そのため、ディスクへのデータの読み書きをいかに速く試みようとも、ボトルネックは通常、常に暗号化ではなくI/Oです。
古いハードウェアでは、暗号化が使用されているとパフォーマンスが低下することがよくありました。これは、当時、ストレージ速度がプロセッサ速度よりも速く向上していたためです。暗号化専用のハードウェアアクセラレーションの欠如と非効率的なアルゴリズムにより、ディスクへのアクセス時に顕著な速度低下が発生することがよくありました。最近のシステムでは、これは逆になります。プロセッサは非常に高速であるため、ストレージデバイスは追いつくのに苦労しています。オーバーヘッドは無視できます。
起動時にディスク全体を復号化しません。代わりに、ディスクから読み取られるときにデータがディスクから読み取られるときに、データを継続的に復号化し、ディスク上の実際のコンテンツはそのままで暗号化されたままにします。復号化はディスクの読み取りに比べて高速であるため、読み取り速度に大きな影響を与えることはありません。もちろん、全体的な負荷が(わずかに)増加します。
起動時にギガバイトのファイルを復号化する理由はありません。 Android起動時にメモリにロードする必要がある正確なファイルのみを復号化する必要があります.
AndroidのFDEはカーネルを暗号化せず、ユーザーデータパーティションのみを暗号化します。詳細は 公式サイトで を参照してください。
最新のハードウェアアクセラレーションによる暗号化は非常に高速で、システムの速度を低下させません。特に、FDEで暗号化されているのがユーザーファイルのみであり、速度がそれほど重要ではない場合です。リンクされたページに実際にリストされている他の欠点がありますが、速度は問題ではありません。
Androidフォンは、パーティション全体を復号化できたとしても、起動時に復号化できませんでした。格納する場所がありません。