Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Składniki, które używają IDataProtectionProvider, muszą przekazać unikatowy parametr cel do metody CreateProtector.
Parametr purposes jest nieodłączną częścią zabezpieczeń systemu ochrony danych, ponieważ zapewnia izolację między użytkownikami kryptograficznymi, nawet jeśli główne klucze kryptograficzne są takie same.
Gdy użytkownik określa cel, ciąg przeznaczenia jest używany wraz z głównymi kluczami kryptograficznymi w celu uzyskania podklucze kryptograficzne unikatowe dla tego konsumenta. To izoluje użytkownika od wszystkich innych użytkowników kryptograficznych w aplikacji: żaden inny składnik nie może odczytać jego ładunków, i on również nie może odczytać ładunków innych składników. Ta izolacja czyni niewykonalnymi wszystkie kategorie ataków przeciwko składnikowi.
Na powyższym IDataProtector diagramie wystąpienia A i B nie mogą odczytywać ładunków nawzajem, tylko swoje własne.
Ciąg znaków przeznaczenia nie musi być tajny. Powinien być po prostu unikatowy w tym sensie, że żaden inny prawidłowo działający składnik nigdy nie zapewni tego samego ciągu celu.
Wskazówka
Używanie przestrzeni nazw i nazwy typu składnika korzystającego z interfejsów API ochrony danych jest dobrą regułą, ponieważ w praktyce te informacje nigdy nie będą powodować konfliktów.
Składnik utworzony przez firmę Contoso, który jest odpowiedzialny za generowanie tokenów typu bearer, może używać nazwy Contoso.Security.BearerToken jako ciągu celu. Lub — jeszcze lepiej — może użyć nazwy Contoso.Security.BearerToken.v1 jako stringu celu. Dołączanie numeru wersji pozwala przyszłej wersji oprogramowania wykorzystać Contoso.Security.BearerToken.v2 jako jej przeznaczenie, a różne wersje będą całkowicie odizolowane od siebie pod względem danych przesyłanych w ładunkach.
Ponieważ parametr purposes jest tablicą ciągów, można to było zamiast tego określić jako [ "Contoso.Security.BearerToken", "v1" ]. Umożliwia to ustanowienie hierarchii celów i otwarcie możliwości obsługi wielu dzierżaw w systemie ochrony danych.
Ostrzeżenie
Składniki nie powinny zezwalać na wprowadzanie niezaufanych danych wejściowych użytkownika jako jedyne źródło danych wejściowych dla łańcucha celów.
Rozważmy na przykład składnik Contoso.Messaging.SecureMessage, który jest odpowiedzialny za przechowywanie bezpiecznych komunikatów. Jeśli składnik bezpiecznego przesyłania wiadomości miałby wywołać CreateProtector([ username ]), złośliwy użytkownik mógłby utworzyć konto z nazwą użytkownika "Contoso.Security.BearerToken", aby skłonić składnik do wywołania CreateProtector([ "Contoso.Security.BearerToken" ]), co mogłoby nieintencjonalnie spowodować, że system bezpiecznego przesyłania wiadomości wygeneruje ładunki, które mogą być postrzegane jako tokeny uwierzytelniające.
Lepszym łańcuchem celów dla składnika obsługi komunikatów jest CreateProtector([ "Contoso.Messaging.SecureMessage", $"User: {username}" ]), który zapewnia właściwą izolację.
Izolacja zapewniana przez IDataProtectionProvider, IDataProtector oraz ich zachowania i cele są następujące:
Dla danego
obiektu metoda utworzy obiekt jednoznacznie powiązany zarówno z obiektem , który go utworzył, jak i parametrem , który zostało przekazany do metody. Parametr purpose nie może mieć wartości null. (Jeśli cele są określone jako tablica, oznacza to, że tablica nie może mieć zerowej długości, a wszystkie elementy tablicy muszą mieć wartość inną niż null). Pusty cel ciągu jest technicznie dozwolony, ale jest odradzany.
Dwa argumenty celów są równoważne, jeśli i tylko wtedy, gdy zawierają te same ciągi (przy użyciu porównania porządkowego) w tej samej kolejności. Pojedynczy argument przeznaczenia jest odpowiednikiem tablicy celów pojedynczego elementu.
Dwa
IDataProtectorobiekty są równoważne, jeśli i tylko wtedy, gdy są tworzone na podstawie równoważnychIDataProtectionProviderobiektów z równoważnymi parametrami celów.W przypadku danego
IDataProtectorobiektu wywołanieUnprotect(protectedData)zwróci oryginalnyunprotectedData, jeśli i tylko wtedy, gdyprotectedData := Protect(unprotectedData)dla równoważnegoIDataProtectorobiektu.
Uwaga / Notatka
Nie rozważamy przypadku, w którym jakiś składnik świadomie wybiera ciąg celów, który wiadomo, że powoduje konflikt z innym składnikiem. Taki składnik zasadniczo byłby uważany za złośliwy, a ten system nie ma na celu zapewnienia gwarancji bezpieczeństwa w przypadku, gdy złośliwy kod jest już uruchomiony wewnątrz procesu roboczego.
ASP.NET Core