Účelové řetězce v ASP.NET Core
Komponenty, které spotřebovávajíIDataProtectionProvider
, musí metodě předat jedinečný parametrCreateProtector
. Účelem parametru je zabezpečení systému ochrany dat, protože poskytuje izolaci mezi kryptografickými příjemci, i když jsou kořenové kryptografické klíče stejné.
Pokud příjemce určuje účel, použije se řetězec účelu spolu s kořenovými kryptografickými klíči k odvození kryptografických podklíčů jedinečných pro daného příjemce. Tím se izoluje příjemce od všech ostatních kryptografických příjemců v aplikaci: žádná jiná komponenta nemůže číst jeho datové části a nemůže číst datové části jiných komponent. Tato izolace také vykreslí neproveditelné celé kategorie útoku na komponentu.
Ve výše uvedeném IDataProtector
diagramu instance A a B nemohou číst datové části ostatních, pouze jejich vlastní.
Řetězec účelu nemusí být tajný. Měl by být jednoduše jedinečný v tom smyslu, že žádná jiná dobře chovaná komponenta nikdy neposkytne stejný účelový řetězec.
Tip
Použití oboru názvů a názvu typu komponenty, která využívá rozhraní API ochrany dat, je dobrým pravidlem, protože v praxi tyto informace nebudou nikdy v konfliktu.
Komponenta kopírovaná společností Contoso, která je zodpovědná za vytváření nosných tokenů, může jako účelový řetězec používat Contoso.Security.BearerToken. Nebo může jako účelový řetězec použít Contoso.Security.BearerToken.v1. Připojení čísla verze umožňuje budoucí verzi používat Contoso.Security.BearerToken.v2 jako svůj účel a různé verze by byly zcela izolované od sebe, pokud jde o datové části.
Vzhledem k tomu, že účelem parametru CreateProtector
je pole řetězců, bylo by výše uvedené pole zadáno jako [ "Contoso.Security.BearerToken", "v1" ]
. To umožňuje vytvořit hierarchii účelů a otevře možnost scénářů s více tenanty se systémem ochrany dat.
Upozorňující
Komponenty by neměly umožňovat, aby nedůvěryhodný uživatelský vstup byl jediným zdrojem vstupu pro účely řetězu.
Představte si například komponentu Contoso.Messaging.SecureMessage, která zodpovídá za ukládání zabezpečených zpráv. Pokud by komponenta zabezpečeného zasílání zpráv volala CreateProtector([ username ])
, může škodlivý uživatel vytvořit účet s uživatelským jménem "Contoso.Security.BearerToken" při pokusu o volání CreateProtector([ "Contoso.Security.BearerToken" ])
komponenty, a tak neúmyslně způsobit systém zabezpečeného zasílání zpráv datové části, které by mohly být vnímány jako ověřovací tokeny.
Lepším účelem řetězce pro komponentu zasílání zpráv by bylo CreateProtector([ "Contoso.Messaging.SecureMessage", $"User: {username}" ])
, což poskytuje správnou izolaci.
Izolace poskytovaná chováním a chováním IDataProtectionProvider
, IDataProtector
a účel jsou následující:
Pro daný
IDataProtectionProvider
objektCreateProtector
vytvoříIDataProtector
metoda objekt jednoznačně svázaný sIDataProtectionProvider
objektem, který ho vytvořil, i s parametrem účelu, který byl předán metodě.Parametr účelu nesmí být null. (Pokud je účel zadán jako matice, znamená to, že pole nesmí mít nulovou délku a všechny prvky pole musí být nenulové.) Účel prázdného řetězce je technicky povolený, ale nedoporučuje se.
Dva argumenty jsou ekvivalentní, pokud a pouze pokud obsahují stejné řetězce (pomocí řadového porovnávače) ve stejném pořadí. Argument s jedním účelem je ekvivalentní odpovídajícímu poli s jedním prvkem.
Dva
IDataProtector
objekty jsou ekvivalentní, pokud jsou vytvořeny z ekvivalentníchIDataProtectionProvider
objektů s ekvivalentními parametry.U daného
IDataProtector
objektu voláníUnprotect(protectedData)
vrátí původníunprotectedData
, pokud a pouze v případěprotectedData := Protect(unprotectedData)
ekvivalentníhoIDataProtector
objektu.
Poznámka
Nebereme v úvahu případ, kdy některá komponenta záměrně zvolí účelový řetězec, o kterém je známo, že je v konfliktu s jinou komponentou. Taková komponenta by se v podstatě považovala za škodlivou a tento systém nemá v úmyslu poskytovat bezpečnostní záruky v případě, že škodlivý kód už běží uvnitř pracovního procesu.