ASP.NET Core kullanarak Windows ve Azure'da bekleyen anahtar şifrelemesi

Veri koruma sistemi , bekleyen şifreleme anahtarlarının nasıl şifreleneceğini belirlemek için varsayılan olarak bir bulma mekanizması kullanır. Geliştirici bulma mekanizmasını geçersiz kılabilir ve bekleyen anahtarların nasıl şifreleneceğini el ile belirtebilir.

Uyarı

Açık bir anahtar kalıcılığı konumu belirtirseniz, veri koruma sistemi bekleme sırasında varsayılan anahtar şifrelemesinin kaydını alır. Sonuç olarak, anahtarlar artık beklemede şifrelenmez. Üretim dağıtımları için açık bir anahtar şifreleme mekanizması belirtmenizi öneririz. Bekleyen şifreleme mekanizması seçenekleri bu konu başlığında açıklanmıştır.

Azure Key Vault

Anahtarları Azure Key Vault'ta depolamak için sistemi sınıfında ile ProtectKeysWithAzureKeyVaultStartup yapılandırın:

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

Daha fazla bilgi için bkz . ASP.NET Çekirdek Veri Korumasını Yapılandırma: ProtectKeysWithAzureKeyVault.

Windows DPAPI

Yalnızca Windows dağıtımları için geçerlidir.

Windows DPAPI kullanıldığında, anahtar malzeme depolamada kalıcı hale getirilmeden önce CryptProtectData ile şifrelenir. DPAPI, geçerli makinenin dışında hiç okunmayan veriler için uygun bir şifreleme mekanizmasıdır (ancak bu anahtarları Active Directory'ye yedeklemek mümkündür). DPAPI bekleyen anahtar şifrelemesini yapılandırmak için ) uzantı yöntemlerinden birini çağırın ProtectKeysWithDpapi:

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

Parametresiz çağrılırsa ProtectKeysWithDpapi , kalıcı anahtar halkasını yalnızca geçerli Windows kullanıcı hesabı deşifre edebilir. İsteğe bağlı olarak makinedeki herhangi bir kullanıcı hesabının (yalnızca geçerli kullanıcı hesabının değil) anahtar halkasını deşifre edebilmesini belirtebilirsiniz:

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

X.509 sertifikası

Uygulama birden çok makineye yayılmışsa, paylaşılan bir X.509 sertifikasını makineler arasında dağıtmak ve barındırılan uygulamaları bekleyen anahtarları şifrelemek üzere sertifikayı kullanacak şekilde yapılandırmak uygun olabilir:

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

.NET Framework sınırlamaları nedeniyle yalnızca CAPI özel anahtarları olan sertifikalar desteklenir. Bu sınırlamalara yönelik olası geçici çözümler için aşağıdaki içeriğe bakın.

Windows DPAPI-NG

Bu mekanizma yalnızca Windows 8/Windows Server 2012 veya sonraki sürümlerde kullanılabilir.

Windows 8'den başlayarak, Windows işletim sistemi DPAPI-NG'yi (CNG DPAPI olarak da adlandırılır) destekler. Daha fazla bilgi için bkz . CNG DPAPI hakkında.

Sorumlu, bir koruma tanımlayıcı kuralı olarak kodlanır. çağıran ProtectKeysWithDpapiNGaşağıdaki örnekte anahtar halkasının şifresini yalnızca belirtilen SID'ye sahip etki alanına katılmış kullanıcı çözebilir:

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);
}

parametresiz bir aşırı yükleme de vardır ProtectKeysWithDpapiNG. "SID={CURRENT_ACCOUNT_SID}" kuralını belirtmek için bu kolaylık yöntemini kullanın; burada CURRENT_ACCOUNT_SID geçerli Windows kullanıcı hesabının SID değeridir:

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

Bu senaryoda, AD etki alanı denetleyicisi DPAPI-NG işlemleri tarafından kullanılan şifreleme anahtarlarını dağıtmaktan sorumludur. Hedef kullanıcı, etki alanına katılmış herhangi bir makineden (işlemin kendi kimliği altında çalışması koşuluyla) şifrelenmiş yükü deşifre edebilir.

Windows DPAPI-NG ile sertifika tabanlı şifreleme

Uygulama Windows 8.1/Windows Server 2012 R2 veya sonraki bir sürümde çalışıyorsa, sertifika tabanlı şifreleme gerçekleştirmek için Windows DPAPI-NG kullanabilirsiniz. "CERTIFICATE=HashId:THUMBPRINT" kural tanımlayıcı dizesini kullanın; burada THUMBPRINT , sertifikanın onaltılık kodlanmış SHA1 parmak izidir:

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

Anahtarların deşifre edilmesi için bu depoya işaret eden tüm uygulamalar Windows 8.1/Windows Server 2012 R2 veya sonraki sürümlerde çalışıyor olmalıdır.

Özel anahtar şifrelemesi

Yerleşik mekanizmalar uygun değilse, geliştirici özel IXmlEncryptorbir sağlayarak kendi anahtar şifreleme mekanizmasını belirtebilir.