Bagikan melalui


Enkripsi kunci tidak aktif di Windows dan Azure menggunakan ASP.NET Core

Sistem perlindungan data menggunakan mekanisme penemuan secara default untuk menentukan bagaimana kunci kriptografi harus dienkripsi saat tidak aktif. Pengembang dapat mengambil alih mekanisme penemuan dan menentukan secara manual bagaimana kunci harus dienkripsi saat tidak aktif.

Peringatan

Jika Anda menentukan lokasi persistensi kunci eksplisit, sistem perlindungan data membatalkan pendaftaran enkripsi kunci default saat mekanisme tidak aktif. Akibatnya, kunci tidak lagi dienkripsi saat tidak aktif. Kami menyarankan agar Anda menentukan mekanisme enkripsi kunci eksplisit untuk penyebaran produksi. Opsi mekanisme enkripsi saat istirahat dijelaskan dalam topik ini.

Azure Key Vault

Untuk menyimpan kunci di Azure Key Vault, konfigurasikan sistem dengan ProtectKeysWithAzureKeyVault di Startup kelas :

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

Untuk informasi selengkapnya, lihat Mengonfigurasi ASP.NET Perlindungan Data Inti: ProtectKeysWithAzureKeyVault.

Windows DPAPI

Hanya berlaku untuk penyebaran Windows.

Ketika Windows DPAPI digunakan, materi kunci dienkripsi dengan CryptProtectData sebelum disimpan ke penyimpanan. DPAPI adalah mekanisme enkripsi yang sesuai untuk data yang tidak pernah dibaca di luar komputer saat ini (meskipun dimungkinkan untuk mencadangkan kunci ini hingga Direktori Aktif). Untuk mengonfigurasi enkripsi kunci saat tidak aktif DPAPI, panggil salah ProtectKeysWithDpapisatu metode ekstensi ) :

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

Jika ProtectKeysWithDpapi dipanggil tanpa parameter, hanya akun pengguna Windows saat ini yang dapat menguraikan cincin kunci yang bertahan. Anda dapat secara opsional menentukan bahwa setiap akun pengguna di komputer (bukan hanya akun pengguna saat ini) yang dapat menguraikan cincin kunci:

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

Sertifikat X.509

Jika aplikasi tersebar di beberapa komputer, mungkin lebih mudah untuk mendistribusikan sertifikat X.509 bersama di seluruh mesin dan mengonfigurasi aplikasi yang dihosting untuk menggunakan sertifikat untuk enkripsi kunci saat tidak aktif:

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

Karena keterbatasan .NET Framework, hanya sertifikat dengan kunci privat CAPI yang didukung. Lihat konten di bawah ini untuk kemungkinan solusi untuk batasan ini.

Windows DPAPI-NG

Mekanisme ini hanya tersedia pada Windows 8/Windows Server 2012 atau yang lebih baru.

Dimulai dengan Windows 8, OS Windows mendukung DPAPI-NG (juga disebut CNG DPAPI). Untuk informasi selengkapnya, lihat Tentang CNG DPAPI.

Prinsipal dikodekan sebagai aturan deskriptor perlindungan. Dalam contoh berikut yang memanggil ProtectKeysWithDpapiNG, hanya pengguna yang bergabung dengan domain dengan SID yang ditentukan yang dapat mendekripsi cincin kunci:

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

Ada juga kelebihan ProtectKeysWithDpapiNGparameter dari . Gunakan metode kenyamanan ini untuk menentukan aturan "SID={CURRENT_ACCOUNT_SID}", di mana CURRENT_ACCOUNT_SID adalah SID dari akun pengguna Windows saat ini:

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

Dalam skenario ini, pengendali domain AD bertanggung jawab untuk mendistribusikan kunci enkripsi yang digunakan oleh operasi DPAPI-NG. Pengguna target dapat menguraikan payload terenkripsi dari komputer yang bergabung dengan domain apa pun (asalkan proses berjalan di bawah identitas mereka).

Enkripsi berbasis sertifikat dengan Windows DPAPI-NG

Jika aplikasi berjalan pada Windows 8.1/Windows Server 2012 R2 atau yang lebih baru, Anda dapat menggunakan Windows DPAPI-NG untuk melakukan enkripsi berbasis sertifikat. Gunakan string deskriptor aturan "CERTIFICATE=HashId:THUMBPRINT", di mana THUMBPRINT adalah thumbprint SHA1 yang dikodekan hex dari sertifikat:

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

Aplikasi apa pun yang ditunjukkan pada repositori ini harus berjalan pada Windows 8.1/Windows Server 2012 R2 atau yang lebih baru untuk menguraikan kunci.

Enkripsi kunci kustom

Jika mekanisme dalam kotak tidak sesuai, pengembang dapat menentukan mekanisme enkripsi kunci mereka sendiri dengan menyediakan kustom IXmlEncryptor.