セキュリティ

Windows11 22H2 PDE (Personal Data Encryotion) ファイル暗号化検証

2022年11月11日

本日はWindows 11 22H2で初登場した"Personal Data Encryption" 略して"PDE"について検証記事を投稿いたします。

PDEとは

概要

PDEを一言で言うとWindows Hello for Businessの資格情報を用いてファイル1つ1つに暗号化の処理をかける機能です。

詳細は下記のMicrosoft公式サイトをご参照ください。


有効となる条件

PDEを利用するには下記の条件を満たす必要があります。

・Windows 11 22H2 にアップグレード済み (Pro, Enterprise, Education ライセンス)

・Azure AD参加し、IntuneにてPDE有効化を実施済み

・Windows Hello for Businessを利用している

HomeエディションではAzure AD参加ができずWindows Hello for Business使用不可のため、PDEは対象外となります。

Intune でPDEを有効化する手順などは下記記事を参照ください。


ファイルの暗号化について

現状、PDEのファイル暗号化を実施するソフトウェアはMicrosoftより提供されていません。

そのため、APIを利用して自分でソフトウェアを開発する必要があります。


PDE 実装

開発環境

・Visual Studio 2019 : Windowsフォームアプリケーション(.NET Framework)

WinFormアプリケーションからWinRTを呼び出すために下記のパッケージを追加します。

Microsoft.Windows.SDK.Contracts

パッケージ導入後、package.configをPackageReferenceに移動してください。


ソースコード

使用するAPI

PDEのAPIは下記を使用します。

APIを使用するために、using文に下記を追加します。

using Windows.Security.DataProtection;

UserDataProtectionManager インスタンス生成

TryGetDefault関数を呼び出すことで、現在または既定のユーザーの UserDataProtectionManager インスタンスを取得することができます。

UserDataProtectionManager userDataProtectionManager = UserDataProtectionManager.TryGetDefault();

ココがポイント


TryGetDefault()関数は必ずnullチェックを行ってください。 PDEが有効となる条件を満たしていない端末で本関数を実施するとnullが返ります。
(ちなみに Windows11 22H2 Home エディションでは、PDEの条件を満たしていないのでnullになりました。)


対象ファイルの現在のステータスを確認する
using Windows.Storage;
using Windows.Security.DataProtection;
string filepath = "test.txt";
StorageFile file = await StorageFile.GetFileFromPathAsync(filepath);
if (userDataProtectionManager != null)
{
    UserDataStorageItemProtectionInfo userDataStorageItemProtectionInfo
                    = await userDataProtectionManager.GetStorageItemProtectionInfoAsync(file);

    UserDataAvailability availability = userDataStorageItemProtectionInfo.Availability;
}

UserDataAvailabityに現在のファイルの暗号化ステータスが格納されています。

ステータスの詳細については下記をご参照ください。

0: Always(暗号されていない)
1: AfterFirstUnlock(暗号化されている)
2: WhileUnlocked(暗号化されている)

Microsoft公式サイトを見ると、1と2は下記のような違いがあるそうです。


ファイル暗号化処理

現在のステータスを確認したところで、ファイルの暗号化をかけていきたいと思います。

UserDataAvailabilityを「1」or「2」にすることで暗号化をかけることができます。

(暗号化していない状態では、UserDataAvailabilityは0になっています。)

int input_value = 2; // or 1
UserDataAvailability availabilityNew = (UserDataAvailability)Enum.ToObject(typeof(UserDataAvailability), input_value);
UserDataStorageItemProtectionStatus status = await ProtectStorageItemAsync(userDataProtectionManager, file, availabilityNew);

switch ((int)status)
{
    case 0:
        Console.WriteLine("[+] Protection was successfully.");
        break;
    case 1:
        Console.WriteLine("[-] NotProtectable (The system does not support protection of the specified storage item)");
        break;
    case 2:
        Console.WriteLine("[-] DataUnavailable (Requested protection cannot be applied as the data are currently unavailable. )");
        break;
}

暗号化に使った関数の詳細は下記をご確認ください。

暗号化後のステータスを確認するとUserDataAvailabilityは「2」になっています。

つまり、ファイルは暗号化されたことを意味します。


ファイル暗号化の解除

ファイル暗号化をかけたが、PDEによる暗号化を解除したい場合は UserDataAvailabilityを「0」に戻すとよい。

暗号化のとき同様に「ProtectStorageItemAsync」関数を使用すると実現できます。


暗号化後の結果

ファイルの暗号化が成功するとWindows上でのファイルのアイコンが下記に変わっています。

認証されていないユーザーがアクセスした場合下記のエラーがでます。


まとめ

以上でPDEの検証記事を終了したいと思います。

今後さらなる普及がPDEです。みなさん是非試してみてください。


注意事項

例外処理はソースコード明瞭化のため入れていない部分もありますので、実装段階ではnullチェックなどの追加をお勧めいたします。

本ソースコードを使用したことによるトラブルについては一切責任を負うことができません。


  • この記事を書いた人
  • 最新記事

石川 侑扶(Yusuke Ishikawa)

IoT, AI, デジタルツイン等の最先端な開発経験とセキュリティコンサルティング経験を元に世の中を変えます!

-セキュリティ
-,