Správa klíčů v ASP.NET Core
Systém ochrany dat automaticky spravuje životnost hlavních klíčů používaných k ochraně a zrušení ochrany datových součástí. Každý klíč může existovat v jedné ze čtyř fází:
Vytvořeno – klíč existuje v okruhu klíčů, ale ještě nebyl aktivován. Klíč by se neměl používat pro nové operace ochrany, dokud ne uplyne dostatečná doba, po kterou se klíč mohl rozšířit do všech počítačů, které tento klíč používají.
Aktivní – klíč existuje v okruhu klíčů a měl by se používat pro všechny nové operace Ochrany.
Platnost vypršela – klíč má spuštěnou přirozenou životnost a už by se neměl používat pro nové operace ochrany.
Odvoláno – klíč je ohrožený a nesmí se používat pro nové operace ochrany.
K zrušení ochrany příchozích datové části je možné použít všechny vytvořené, aktivní a prošlé klíče. Odvolané klíče se ve výchozím nastavení nemusí používat k zrušení ochrany datové části, ale vývojář aplikace může toto chování v případě potřeby přepsat.
Upozornění
Vývojář může být v tempu odstranit klíč z okruhu klíčů (například odstraněním odpovídajícího souboru ze systému souborů). V tomto okamžiku jsou všechna data chráněná klíčem trvale nezašifrovatelná a neexistuje žádné nouzové přepsání, jako je tomu u odvolaných klíčů. Odstranění klíče je skutečně destruktivní chování a v důsledku toho systém ochrany dat pro provedení této operace nevystavuje žádné rozhraní API první třídy.
Výběr výchozího klíče
Když systém ochrany dat přečte klíčový okruh ze zálohového úložiště, pokusí se z okruhu klíčů najít "výchozí" klíč. Výchozí klíč se používá pro nové operace Ochrany.
Obecný heuristika je, že systém ochrany dat zvolí jako výchozí klíč klíč s nejnovějším datem aktivace. (Pro zkosení hodin mezi serverem je k dispozici malý faktor vychýlení.) Pokud platnost klíče vypršela nebo je odvolán a aplikace nezablokuje automatické generování klíčů, vygeneruje se nový klíč s okamžitou aktivací podle níže uvedených zásad vypršení platnosti klíče a postupného generování.
Systém ochrany dat vygeneruje nový klíč okamžitě místo toho, aby se vrátil k jinému klíči, je to, že nové generování klíčů by se mělo považovat za implicitní vypršení platnosti všech klíčů aktivovaných před novým klíčem. Obecně platí, že nové klíče mohou být nakonfigurované s různými algoritmy nebo mechanismy šifrování v klidových stavu než staré klíče a systém by měl preferovat aktuální konfiguraci před návratem zpět.
Existuje výjimka. Pokud vývojář aplikace zakázal automatické generování klíčů,musí systém ochrany dat zvolit něco jako výchozí klíč. V tomto záložním scénáři systém zvolí nezvolaný klíč s nejnovějším datem aktivace a upřednostní klíče, které měly čas rozšířit se do jiných počítačů v clusteru. Záložní systém může nakonec zvolit výchozí klíč, jehož platnost vypršela. Záložní systém nikdy nevybírá odvolaný klíč jako výchozí klíč a pokud je okruh klíčů prázdný nebo byl odvolán každý klíč, systém při inicializaci vyprodukuje chybu.
Vypršení platnosti a postupné postupné ukonování platnosti klíče
Při vytvoření klíče se automaticky zobrazí datum aktivace { now + 2 days } a datum vypršení platnosti { now + 90 days }. 2denní zpoždění před aktivací dává klíčovou dobu pro rozšíření v rámci systému. To znamená, že umožňuje ostatním aplikacím, které odkazují na zálohovací úložiště, sledovat klíč během příští doby automatické aktualizace, čímž maximalizuje pravděpodobnost, že jakmile se okruh klíčů stane aktivní, rozšíří se do všech aplikací, které by ho mohly potřebovat použít.
Pokud platnost výchozího klíče vyprší do 2 dnů a okruh klíčů ještě nemá klíč, který bude aktivní po vypršení platnosti výchozího klíče, systém ochrany dat automaticky uchová nový klíč v okruhu klíčů. Tento nový klíč má datum aktivace { výchozí datum vypršení platnosti klíče } a datum vypršení platnosti { now + 90 days }. Díky tomu může systém pravidelně automaticky rušit klíče bez přerušení služby.
Můžou se zobrazit okolnosti, kdy se klíč vytvoří s okamžitou aktivací. Jedním z příkladů může být to, že aplikace se po dobu nespouštěla a všem klíčům v okruhu klíčů vypršela platnost. Když k tomu dojde, klíč bude mít datum aktivace { now } bez normálního zpoždění aktivace na 2 dny.
Výchozí životnost klíče je 90 dní, i když je možné ho konfigurovat jako v následujícím příkladu.
services.AddDataProtection()
// use 14-day lifetime instead of 90-day lifetime
.SetDefaultKeyLifetime(TimeSpan.FromDays(14));
Správce může také změnit výchozí systém, i když explicitní volání přepíše všechny SetDefaultKeyLifetime zásady pro systém. Výchozí životnost klíče nesmí být kratší než 7 dnů.
Automatická aktualizace okruhu klíčů
Když se systém ochrany dat inicializuje, přečte klíčový okruh z podkladového úložiště a ukládá ho do mezipaměti. Tato mezipaměť umožňuje, aby operace ochrana a zrušení ochrany pokračovaly bez stisknutí zálohy úložiště. Systém automaticky zkontroluje změny v zálohovacím úložiště přibližně každých 24 hodin nebo po vypršení platnosti aktuálního výchozího klíče (podle toho, co nastane dřív).
Upozornění
Vývojáři by měli rozhraní API pro správu klíčů používat velmi zřídka (pokud vůbec) přímo. Systém ochrany dat bude provádět automatickou správu klíčů, jak je popsáno výše.
Systém ochrany dat zpřístupňuje rozhraní, které je možné použít ke kontrole a IKeyManager změnám v okruhu klíčů. Systém utiliky, který poskytoval instanci , může také IDataProtectionProvider poskytnout instanci pro vaši IKeyManager spotřebu. Alternativně můžete přetáhnout přímo IKeyManager z , jak je uvedeno v následujícím IServiceProvider příkladu.
Jakákoli operace, která změní okruh klíčů (explicitní vytvoření nového klíče nebo odvolání), zneplatní mezipaměť v paměti. Další volání metody nebo způsobí, že systém ochrany dat znovu přečte okruh klíčů a Protect Unprotect znovu vytvoří mezipaměť.
Následující ukázka ukazuje použití rozhraní ke kontrole a manipulaci s kruhem klíčů, včetně odvolání stávajících klíčů a ručního generování IKeyManager nového klíče.
using System;
using System.IO;
using System.Threading;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.DataProtection.KeyManagement;
using Microsoft.Extensions.DependencyInjection;
public class Program
{
public static void Main(string[] args)
{
var serviceCollection = new ServiceCollection();
serviceCollection.AddDataProtection()
// point at a specific folder and use DPAPI to encrypt keys
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp-keys"))
.ProtectKeysWithDpapi();
var services = serviceCollection.BuildServiceProvider();
// perform a protect operation to force the system to put at least
// one key in the key ring
services.GetDataProtector("Sample.KeyManager.v1").Protect("payload");
Console.WriteLine("Performed a protect operation.");
Thread.Sleep(2000);
// get a reference to the key manager
var keyManager = services.GetService<IKeyManager>();
// list all keys in the key ring
var allKeys = keyManager.GetAllKeys();
Console.WriteLine($"The key ring contains {allKeys.Count} key(s).");
foreach (var key in allKeys)
{
Console.WriteLine($"Key {key.KeyId:B}: Created = {key.CreationDate:u}, IsRevoked = {key.IsRevoked}");
}
// revoke all keys in the key ring
keyManager.RevokeAllKeys(DateTimeOffset.Now, reason: "Revocation reason here.");
Console.WriteLine("Revoked all existing keys.");
// add a new key to the key ring with immediate activation and a 1-month expiration
keyManager.CreateNewKey(
activationDate: DateTimeOffset.Now,
expirationDate: DateTimeOffset.Now.AddMonths(1));
Console.WriteLine("Added a new key.");
// list all keys in the key ring
allKeys = keyManager.GetAllKeys();
Console.WriteLine($"The key ring contains {allKeys.Count} key(s).");
foreach (var key in allKeys)
{
Console.WriteLine($"Key {key.KeyId:B}: Created = {key.CreationDate:u}, IsRevoked = {key.IsRevoked}");
}
}
}
/*
* SAMPLE OUTPUT
*
* Performed a protect operation.
* The key ring contains 1 key(s).
* Key {1b948618-be1f-440b-b204-64ff5a152552}: Created = 2015-03-18 22:20:49Z, IsRevoked = False
* Revoked all existing keys.
* Added a new key.
* The key ring contains 2 key(s).
* Key {1b948618-be1f-440b-b204-64ff5a152552}: Created = 2015-03-18 22:20:49Z, IsRevoked = True
* Key {2266fc40-e2fb-48c6-8ce2-5fde6b1493f7}: Created = 2015-03-18 22:20:51Z, IsRevoked = False
*/
Pokud chcete zobrazit komentáře ke kódu přeložené do jiných jazyků než angličtiny, dejte nám vědět v tomto problému diskuze na GitHubu.
Úložiště klíčů
Systém ochrany dat má heuristika, při které se pokouší automaticky odvodit vhodné umístění úložiště klíčů a mechanismus šifrování při klidových uloženích. Mechanismus trvalosti klíče také může nakonfigurovat vývojář aplikace. Následující dokumenty popisují implementace těchto mechanismů, které jsou součástí: