web-dev-qa-db-ja.com

ストレージが暗号化された後にユーザーのパスワードを変更するにはどうすればよいですか? (OS X、Android)

OS X( FileVault )とAndroidのストレージを暗号化する組み込み機能があります。

OS Xの場合:暗号化を有効にするには、現在のユーザーにパスワードで保護されたアカウントが必要です。暗号化を有効にすると、リカバリキーが生成されます(HHWj-Y8DK-ODO4-BQEN-FQ4V-M4O8など)。暗号化が終了した後(およびその前に可能性があります)、ユーザーはストレージを再暗号化する必要なく、自分のパスワードを変更できます。

Androidの場合:ロック画面の保護をピンまたはパスワードのいずれかに設定する必要があります。ストレージの暗号化が行われた後(おそらく、その前にも)、ユーザーはパスワードを変更したり、パスワードからPINに切り替えたり、その逆を行うこともできます。

これが私を困惑させています:私の理解は、ストレージが暗号化されるとき、現在のユーザーパスワード(アーカイブの暗号化のようなもの)で行われ、パスワードが変更された場合、ストレージ全体を再暗号化する必要があるということです。この(明らかに正しくない)理解により、次の質問が生じます。

  1. 次に、「パスワード」ではないため、「キー」に基づいて暗号化が行われますか?
    • OS Xの場合、それはリカバリキーだと思いますが、それではユーザーのパスワードにどのように接続しますか?
  2. パスワードが暗号化の基礎ではない場合、ストレージを暗号化する前にパスワードを設定する必要があるのはなぜですか?
  3. パスワードを変更した後、(再暗号化せずに)ストレージを復号化する機能はどのように維持されますか?
28
Filippo Walker

高レベルでは、ディスク暗号化は、データ暗号化キー(DEK)とキー暗号化キー(KEK)を使用して実装されます。 DEKはランダムに生成され、ドライブの暗号化に使用されます。KEKは、PBKDF2やArgon2などのKDFを使用してユーザーのパスワードから導出され、DEKの暗号化に使用されます。

パスワードを変更すると、DEKは新しいパスワードから派生した新しいKEKで単純に暗号化されます。

誤った安心感を避けるために、パスワードなしで暗号化することはおそらく禁止されています。ドアをロックするのと似ていますが、鍵をロックのままにしておきます。

もちろん、誰かがそれを見つけたと信じてパスワードを変更していて、その人が暗号化されたデバイスにもアクセスできる場合は、DEKのコピーが保存されている可能性があります。この場合、ドライブ全体を再暗号化する必要があるかもしれませんが、そうすることはおそらく時間がかかるでしょう。

48
AndrolGenhald

AndrolGenhaldの高レベルの回答に完全に同意します。 Androidのストレージ暗号化実装の補足的な低レベルのウォークスルーに関心がある場合:

Androidはファイルベースの暗号化(FBE)およびフルディスク暗号化(FDE)を実行できます。「ディスク」は/ dataパーティションを指します。原則を説明するために、FDEに焦点を当てます。セットアップは、ボリュームデーモン(Vold)によって、具体的には system/vold/cryptfs.cpp で行われます。

  • cryptfs_enable_internal(int crypt_type, const char* passwd, ...) ストレージ暗号化を開始し、_crypt_type_がピンまたはパスワードを使用するかどうかを指定します(ロック解除画面に表示するキーボードを決定するため)およびpasswd実際のユーザーPIN /パスワードを指定します。暗号化されたパーティションに沿って格納されるフッター_crypt_ftr_を設定し、次に_create_encrypted_random_key_を呼び出して_crypt_ftr_に入力します。

    • _create_encrypted_random_key_ はランダムマスターキーとランダムソルトを生成し、それらを_encrypt_master_key_に渡します。
    • _encrypt_master_key_ は、saltとユーザーのピン/パスワードを入力として受け取り、中間キーを決定的に導出するキー導出関数(scryptなど)を使用します。マスターキーは、AES-128-CBCを使用して中間キーで暗号化されます。暗号化されたマスターキーとソルトは_crypt_ftr_に格納されますが、ユーザーのPIN /パスワードは格納されません。
    • _cryptfs_enable_internal_に戻ると、_crypt_ftr_がディスクに書き込まれます。次に、Linuxの_dm-crypt_による実際のストレージ暗号化が、復号化されたマスターキーを使用してトリガーされます。
  • cryptfs_check_passwd(const char* passwd) 上記の手順をバックトラックして復号化されたマスターキーを取得することにより、ストレージの復号化を開始します。暗号化されたマスターキーとソルトを含む_crypt_ftr_をディスクから読み取る必要があります。ユーザー提供のピン/パスワードとソルトが鍵導出関数に送られます。これにより、マスターキーを復号化できる中間キーが生成されます(これのほとんどは _decrypt_master_key_aux_ で発生します)。

  • cryptfs_changepw(int crypt_type, const char* newpw) ユーザーPIN /パスワードの変更を処理します。新しいマスターキーは生成されません。新しいユーザーピン/パスワードを使用して_encrypt_master_key_で既存のマスターキーを暗号化するだけです。

この情報に基づくと、あなたの質問に対する答えは次のようになります。

  1. ランダムに生成されたマスターキーは、実際のストレージ暗号化に使用されます。

  2. マスターキーを暗号化するには、ユーザーPIN /パスワードが必要です。したがって、ストレージを復号化するためのマスターキーを後で取得するには、ユーザーPIN /パスワードが必要です。

  3. ユーザーPIN /パスワードを変更しても、マスターキーは変更されず、マスターキーの暗号化のみが変更されます。