Строки purpose

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

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

../../../_images/purposes.png

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

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

Совет

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

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

Поскольку параметр purposes является массивом строк, его можно указать как [ “Contoso.Security.BearerToken”, “v1” ]. Это позволяет определить иерархию целей и дает возможность использовать различные сценарии с системой защиты данных.

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

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

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

Лучшей цепочкой purposes для компонента сообщений может стать CreateProtector([ “Contoso.Messaging.SecureMessage”, “User: username” ]), которая предлагает лучшую изоляцию.

Вот поведение IDataProtectionProvider, IDataProtector и purposes:

  • Для заданного объекта IDataProtectionProvider метод CreateProtector создаст объект IDataProtector, связанный с объектом IDataProtectionProvider, который его создал, и параметром purposes, который был передан в метод.
  • Параметр purpose не должен быть null. (Если purposes указан как массив, это обозначает, что массив не должен быть нулевой длины и все элементы массива не должны быть null). Пустая строка purpose технически разрешена, но ее не стоит использовать.
  • Два аргумента purposes эквивалентны, только тогда, когда они содержать одинаковые строки в том же порядке. Один аргумент purpose эквивалентен соответствующему массиву purposes с одним элементом.
  • Два объекта IDataProtector эквивалентны, только тогда, когда они созданы от эквивалентных объектов IDataProtectionProvider с одинаковыми параметрами purposes.
  • Для заданного объекта IDataProtector вызов Unprotect(protectedData) вернет оригинальный unprotectedData, только если protectedData := Protect(unprotectedData) для эквивалентного объекта IDataProtector.

Примечание

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

Поделись хорошей новостью с друзьями!
Следи за новостями!