Windows および Azure での ASP.NET Core を使用した保存時のキーの暗号化

データ保護システムでは、暗号化キーを保存時にどのように暗号化する必要があるかを決定するために、既定で検出メカニズムが使用されます。 開発者は、検出メカニズムをオーバーライドして、保存時にキーを暗号化する必要がある方法を手動で指定できます。

警告

明示的なキー永続化の場所を指定した場合、データ保護システムでは保存時の既定のキー暗号化メカニズムが登録解除されます。 その結果、キーは保存時に暗号化されなくなります。 運用展開のためには、明示的なキー暗号化メカニズムを指定することをお勧めします。 保存時の暗号化メカニズムのオプションについては、このトピックで説明します。

Azure Key Vault

Azure Key Vault にキーを格納するには、Startup クラスで ProtectKeysWithAzureKeyVault を使ってシステムを構成します。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToAzureBlobStorage(new Uri("<blobUriWithSasToken>"))
        .ProtectKeysWithAzureKeyVault("<keyIdentifier>", "<clientId>", "<clientSecret>");
}

詳細については、「ASP.NET Core データ保護を構成する」の「ProtectKeysWithAzureKeyVault」を参照してください。

Windows DPAPI

Windows の展開にのみ適用されます。

Windows DPAPI が使用されている場合、キー マテリアルは CryptProtectData によって暗号化されてから、ストレージへの永続化が行われます。 DPAPI は、現在のマシンの外部で読み取られることがないデータには適切な暗号化メカニズムです (ただし、これたのキーを Active Directory にバックアップすることができます)。 保存時に DPAPI キー暗号化を構成するには、いずれかの ProtectKeysWithDpapi 拡張メソッドを呼び出します。

public void ConfigureServices(IServiceCollection services)
{
    // Only the local user account can decrypt the keys
    services.AddDataProtection()
        .ProtectKeysWithDpapi();
}

パラメーターを指定せずに ProtectKeysWithDpapi を呼び出した場合は、現在の Windows ユーザー アカウントのみが、永続化されたキー リングを解読できます。 必要に応じて、(現在のユーザー アカウントだけでなく) マシン上のすべてのユーザー アカウントがキー リングを解読できることを指定できます。

public void ConfigureServices(IServiceCollection services)
{
    // All user accounts on the machine can decrypt the keys
    services.AddDataProtection()
        .ProtectKeysWithDpapi(protectToLocalMachine: true);
}

X.509 証明書

アプリが複数のマシンに分散配置されている場合は、共有する X.509 証明書をすべてのマシンにわたって配布し、保存時のキーの暗号化にその証明書を使用するように、ホストされているアプリを構成すると便利なことがあります。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .ProtectKeysWithCertificate("3BCE558E2AD3E0E34A7743EAB5AEA2A9BD2575A0");
}

.NET Framework の制限により、CAPI 秘密キーを持つ証明書のみがサポートされています。 これらの制限の考えられる回避策については、下記のコンテンツを参照してください。

Windows DPAPI-NG

このメカニズムは Windows 8/Windows Server 2012 以降でのみ使用できます。

Windows 8 以降の Windows OS では、DPAPI-NG (CNG DPAPI とも呼ばれます) がサポートされています。 詳細については、CNG DPAPI に関するページを参照してください。

プリンシパルは、保護記述子の規則としてエンコードされます。 ProtectKeysWithDpapiNG を呼び出す次の例では、指定した SID を持つドメイン参加済みユーザーのみがキー リングの暗号化を解除できます。

public void ConfigureServices(IServiceCollection services)
{
    // Uses the descriptor rule "SID=S-1-5-21-..."
    services.AddDataProtection()
        .ProtectKeysWithDpapiNG("SID=S-1-5-21-...",
        flags: DpapiNGProtectionDescriptorFlags.None);
}

パラメーターがない、ProtectKeysWithDpapiNG のオーバーロードも存在します。 この便利なメソッドを使用して、"SID={CURRENT_ACCOUNT_SID}" という規則を指定します。CURRENT_ACCOUNT_SID は、現在の Windows ユーザー アカウントの SID です。

public void ConfigureServices(IServiceCollection services)
{
    // Use the descriptor rule "SID={current account SID}"
    services.AddDataProtection()
        .ProtectKeysWithDpapiNG();
}

このシナリオでは、DPAPI-NG 操作によって使用される暗号化キーを配布する役割を担うのは AD ドメイン コントローラーです。 ターゲット ユーザーは、ドメインに参加しているマシンからの暗号化されたペイロードを解読できます (プロセスが自分の ID で実行されている場合)。

Windows DPAPI-NG を使用した証明書ベースの暗号化

アプリが Windows 8.1/Windows Server 2012 R2 以降で実行されている場合は、Windows DPAPI-NG を使用して証明書ベースの暗号化を実行できます。 規則記述子の文字列 "CERTIFICATE = HashId:THUMBPRINT" を使用します。ここで THUMBPRINT は、16 進数でエンコードされた、証明書の SHA1 拇印です。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .ProtectKeysWithDpapiNG("CERTIFICATE=HashId:3BCE558E2...B5AEA2A9BD2575A0",
            flags: DpapiNGProtectionDescriptorFlags.None);
}

キーの暗号を解除するには、このリポジトリで指し示されているすべてのアプリが Windows 8.1/Windows Server 2012 R2 以降で実行されている必要があります。

カスタムのキー暗号化

付属のメカニズムが適切でない場合には、カスタムの IXmlEncryptor を提供することで、開発者が独自のキー暗号化メカニズムを指定できます。