Поделиться через


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

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

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

Пример диаграммы назначения

На приведенной выше 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 объекта метод создаст CreateProtector объект, однозначно связанный с IDataProtector объектом, который создал его, и параметром целей, переданным IDataProtectionProvider в метод.

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

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

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

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

Замечание

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