Строки назначения в ASP.NET Core

Компоненты, которые потребляютIDataProtectionProvider, должны передавать в метод уникальный параметр целейCreateProtector. Параметр целей присущ безопасности системы защиты данных, так как он обеспечивает изоляцию между криптографическими потребителями, даже если корневые криптографические ключи одинаковы.

Когда потребитель задает назначение, строка назначения используется вместе с корневыми ключами шифрования для получения криптографических подключей, уникальных для этого потребителя. Это изолирует потребителя от всех других криптографических потребителей в приложении: ни один другой компонент не может считывать полезные данные, и он не может считывать полезные данные других компонентов. Эта изоляция также отображает неубедимые целые категории атак на компонент.

Purpose Diagram Example

На приведенной выше IDataProtector схеме экземпляры A и B не могут считывать полезные данные друг друга, только их собственные.

Строка назначения не должна быть секретом. Он должен быть просто уникальным в том смысле, что ни один другой хорошо вел себя компонент никогда не будет предоставлять ту же строку назначения.

Совет

Использование пространства имен и имени типа компонента, использующего API защиты данных, является хорошим правилом, так как на практике эта информация никогда не будет конфликтоваться.

Компонент, созданный Contoso, отвечающий за токены носителя, может использовать Contoso.Security.BearerToken в качестве строки назначения. Или - еще лучше - он может использовать Contoso.Security.BearerToken.v1 в качестве строки назначения. Добавление номера версии позволяет будущей версии использовать Contoso.Security.BearerToken.v2 в качестве своей цели, и различные версии будут полностью изолированы друг от друга, пока полезные данные идут.

Так как параметр CreateProtector целей является строковым массивом, указанный выше может быть указан как [ "Contoso.Security.BearerToken", "v1" ]. Это позволяет устанавливать иерархию целей и открывает возможность сценариев многотенантности с помощью системы защиты данных.

Предупреждение

Компоненты не должны разрешать ненадежные входные данные пользователей единственным источником входных данных для цепочки целей.

Например, рассмотрим компонент Contoso.Messaging.SecureMessage, который отвечает за хранение защищенных сообщений. Если компонент безопасного обмена сообщениями должен был вызвать CreateProtector([ username ]), то злоумышленник может создать учетную запись с именем пользователя Contoso.Security.BearerToken в попытке вызвать компонент CreateProtector([ "Contoso.Security.BearerToken" ]), таким образом, непреднамеренно вызывая систему безопасного обмена сообщениями полезные данные, которые могут рассматриваться как маркеры проверки подлинности.

Цепочка целей для компонента обмена сообщениями будет CreateProtector([ "Contoso.Messaging.SecureMessage", $"User: {username}" ])иметь правильную изоляцию.

Изоляция, предоставляемая и поведением IDataProtectionProvider, IDataProtectorи целей, выглядит следующим образом:

  • Для данного IDataProtectionProvider объекта метод создаст IDataProtector объект, однозначно связанный с IDataProtectionProvider объектом, который создал его, и параметром целей, переданным CreateProtector в метод.

  • Параметр назначения не должен иметь значение NULL. (Если в качестве массива указаны цели, это означает, что массив не должен иметь нулевой длины, а все элементы массива должны быть не null.) Пустая строка назначения технически разрешена, но не рекомендуется.

  • Аргументы двух целей эквивалентны, если они содержат одни и те же строки (с использованием порядкового сравнения) в одном порядке. Один аргумент назначения эквивалентен соответствующему массиву целей с одним элементом.

  • Два IDataProtector объекта эквивалентны, если они создаются из эквивалентных IDataProtectionProvider объектов с эквивалентными параметрами целей.

  • Для заданного IDataProtector объекта вызов Unprotect(protectedData) возвращает исходный unprotectedData , если и только если protectedData := Protect(unprotectedData) для эквивалентного IDataProtector объекта.

Примечание.

Мы не рассматриваем ситуацию, когда некоторый компонент намеренно выбирает строку назначения, которая, как известно, конфликтует с другим компонентом. Такой компонент, по сути, считается вредоносным, и эта система не предназначена для обеспечения гарантий безопасности в случае, если вредоносный код уже работает внутри рабочего процесса.