ASP.NET Core での保存時のキーの暗号化Key encryption at rest in 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>");
}

詳細については、次を参照してください。 ASP.NET Core データ保護の構成。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). DPAPI の保存時のキーの暗号化を構成するには、いずれかを呼び出して、 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 NG 操作によって使用される暗号化キーを配布する責任を負います。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 で、アプリが実行されている場合は後で、NG-Windows DPAPI を使用して証明書ベースの暗号化を実行することができます。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. ルールの記述子の文字列を使用して"証明書 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.