ASP.NET Core を使用した Windows および Azure での保存時のキーの暗号化Key encryption at rest in Windows and Azure using ASP.NET Core

データ保護システムでは、暗号化キーを保存時に暗号化する方法を 既定で検出するメカニズム を使用します。The data protection system employs a discovery mechanism by default to determine how cryptographic keys should be encrypted at rest. 開発者は検出メカニズムをオーバーライドし、保存時のキーの暗号化方法を手動で指定できます。The developer can override the discovery mechanism and manually specify how keys should be encrypted at rest.

警告

明示的なキーの 保存場所を指定すると、データ保護システムによって、解除の既定のキー暗号化メカニズムが使用されます。If you specify an explicit key persistence location, the data protection system deregisters the default key encryption at rest mechanism. そのため、キーは保存時に暗号化されなくなりました。Consequently, keys are no longer encrypted at rest. 運用環境のデプロイで は、明示的なキー暗号化メカニズムを指定 することをお勧めします。We recommend that you specify an explicit key encryption mechanism for production deployments. 保存時暗号化メカニズムのオプションについては、このトピックで説明します。The encryption-at-rest mechanism options are described in this topic.

Azure Key VaultAzure Key Vault

Azure Key Vaultにキーを格納するには、クラスでProtectKeysWithAzureKeyVaultを使用してシステムを構成し Startup ます。To store keys in Azure Key Vault, configure the system with ProtectKeysWithAzureKeyVault in the Startup class:

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

詳細については、「 Configure ASP.NET Core Data Protection: ProtectKeysWithAzureKeyVault」を参照してください。For more information, see Configure ASP.NET Core Data Protection: ProtectKeysWithAzureKeyVault.

Windows DPAPIWindows DPAPI

Windows の展開にのみ適用されます。Only applies to Windows deployments.

Windows DPAPI が使用されている場合、キーマテリアルは CryptProtectData で暗号化されてから、ストレージに保存されます。When Windows DPAPI is used, key material is encrypted with CryptProtectData before being persisted to storage. DPAPI は、現在のコンピューターの外部で読み取られることがないデータの適切な暗号化メカニズムです (ただし、これらのキーを Active Directory に戻すことはできますが 、「DPAPI とローミングプロファイル」を参照してください)。DPAPI is an appropriate encryption mechanism for data that's never read outside of the current machine (though it's possible to back these keys up to Active Directory; see DPAPI and Roaming Profiles). Rest 暗号化キーを構成するには、次のいずれかの ProtectKeysWithDpapi 拡張メソッドを呼び出します。To configure DPAPI key-at-rest encryption, call one of the ProtectKeysWithDpapi extension methods:

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

ProtectKeysWithDpapiパラメーターを使用せずにを呼び出すと、現在の Windows ユーザーアカウントのみが、永続化されたキーリングを解読できます。If ProtectKeysWithDpapi is called with no parameters, only the current Windows user account can decipher the persisted key ring. 必要に応じて、(現在のユーザーアカウントだけでなく) コンピューター上のすべてのユーザーアカウントがキーリングを解読できるように指定することもできます。You can optionally specify that any user account on the machine (not just the current user account) be able to decipher the key ring:

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

X.509 証明書X.509 certificate

アプリが複数のコンピューターに分散している場合は、共有の x.509 証明書をコンピューター全体に配布し、保存されているキーの暗号化に証明書を使用するようにホストされるアプリを構成すると便利な場合があります。If the app is spread across multiple machines, it may be convenient to distribute a shared X.509 certificate across the machines and configure the hosted apps to use the certificate for encryption of keys at rest:

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

.NET Framework の制限により、CAPI 秘密キーを持つ証明書のみがサポートされます。Due to .NET Framework limitations, only certificates with CAPI private keys are supported. これらの制限について考えられる回避策については、以下のコンテンツを参照してください。See the content below for possible workarounds to these limitations.

Windows DPAPI-NGWindows DPAPI-NG

このメカニズムは、Windows 8/Windows Server 2012 以降でのみ使用できます。This mechanism is available only on Windows 8/Windows Server 2012 or later.

Windows 8 以降では、Windows OS は DPAPI NG (CNG DPAPI とも呼ばれます) をサポートしています。Beginning with Windows 8, Windows OS supports DPAPI-NG (also called CNG DPAPI). 詳細については、「 CNG DPAPI について」を参照してください。For more information, see About CNG DPAPI.

プリンシパルは、保護記述子の規則としてエンコードされます。The principal is encoded as a protection descriptor rule. 次の例では、 ProtectKeysWithDpapiNGを呼び出します。指定された SID を持つドメインに参加しているユーザーのみが、キーリングの暗号化を解除できます。In the following example that calls ProtectKeysWithDpapiNG, only the domain-joined user with the specified SID can decrypt the key ring:

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 ます。There's also a parameterless overload of ProtectKeysWithDpapiNG. この便利な方法を使用して、"SID = {CURRENT_ACCOUNT_SID}" という規則を指定します。 CURRENT_ACCOUNT_SID は現在の Windows ユーザーアカウントの SID です。Use this convenience method to specify the rule "SID={CURRENT_ACCOUNT_SID}", where CURRENT_ACCOUNT_SID is the SID of the current Windows user account:

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

このシナリオでは、AD ドメインコントローラーは、DPAPI によって使用される暗号化キーを配布する役割を担います。In this scenario, the AD domain controller is responsible for distributing the encryption keys used by the DPAPI-NG operations. ターゲットユーザーは、ドメインに参加しているコンピューターから暗号化されたペイロードを解読できます (プロセスが id で実行されている場合)。The target user can decipher the encrypted payload from any domain-joined machine (provided that the process is running under their identity).

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

アプリが Windows 8.1/Windows Server 2012 R2 以降で実行されている場合は、Windows DPAPI-NG を使用して証明書ベースの暗号化を実行できます。If the app is running on Windows 8.1/Windows Server 2012 R2 or later, you can use Windows DPAPI-NG to perform certificate-based encryption. 規則記述子文字列 "CERTIFICATE = HashId: THUMBPRINT" を使用します。ここで、 拇印 は証明書の16進数でエンコードされた SHA1 拇印です。Use the rule descriptor string "CERTIFICATE=HashId:THUMBPRINT", where THUMBPRINT is the hex-encoded SHA1 thumbprint of the certificate:

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

キーの暗号を解除するには、このリポジトリでポイントされているすべてのアプリが Windows 8.1/Windows Server 2012 R2 以降で実行されている必要があります。Any app pointed at this repository must be running on Windows 8.1/Windows Server 2012 R2 or later to decipher the keys.

カスタムキーの暗号化Custom key encryption

インボックス機構が適切でない場合、開発者はカスタム IXmlEncryptorを提供することで、独自のキー暗号化メカニズムを指定できます。If the in-box mechanisms aren't appropriate, the developer can specify their own key encryption mechanism by providing a custom IXmlEncryptor.