Строки назначения в 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
объекта метод создастIDataProtector
объект, однозначно связанный сIDataProtectionProvider
объектом, который создал его, и параметром целей, переданнымCreateProtector
в метод.Параметр назначения не должен иметь значение NULL. (Если в качестве массива указаны цели, это означает, что массив не должен иметь нулевой длины, а все элементы массива должны быть не null.) Пустая строка назначения технически разрешена, но не рекомендуется.
Аргументы двух целей эквивалентны, если они содержат одни и те же строки (с использованием порядкового сравнения) в одном порядке. Один аргумент назначения эквивалентен соответствующему массиву целей с одним элементом.
Два
IDataProtector
объекта эквивалентны, если они создаются из эквивалентныхIDataProtectionProvider
объектов с эквивалентными параметрами целей.Для заданного
IDataProtector
объекта вызовUnprotect(protectedData)
возвращает исходныйunprotectedData
, если и только еслиprotectedData := Protect(unprotectedData)
для эквивалентногоIDataProtector
объекта.
Примечание.
Мы не рассматриваем ситуацию, когда некоторый компонент намеренно выбирает строку назначения, которая, как известно, конфликтует с другим компонентом. Такой компонент, по сути, считается вредоносным, и эта система не предназначена для обеспечения гарантий безопасности в случае, если вредоносный код уже работает внутри рабочего процесса.
ASP.NET Core