Правила HMAC

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

Вычисляет и проверяет код аутентификации сообщений на основе хеш-функции (HMAC). Иногда его называют кодом аутентификации сообщений с ключом или хешем с ключом. В HMAC используется криптографическая хеш-функция, например SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 или MD-5, которая применяется к сообщению вместе с секретным ключом, чтобы создать подпись или код аутентификации сообщения. Термин "сообщение" здесь относится к любому потоку байтов. Отправитель сообщения также может отправить получателю HMAC, чтобы тот мог аутентифицировать сообщение.

Подробнее об HMAC можно узнать из RFC 2104.

Примеры

Как сгенерировать HMAC

<HMAC name='HMAC-1'>

  <Algorithm>SHA256</Algorithm>

  <SecretKey ref='private.secretkey'/>

  <IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables> <!-- optional -->

  <!--
    The "message" can include fixed and multiple variable parts,
    including newlines and static functions.
    Whitespace is significant.
   -->
  <Message>Fixed Part
    {a_variable}
    {timeFormatUTCMs(timeFormatString1,system.timestamp)}
    {nonce}
  </Message>

  <!-- default encoding is base64 -->
  <Output encoding='base16'>name_of_variable</Output>

</HMAC>

Как проверить HMAC

<HMAC name='HMAC-1'>

  <Algorithm>SHA256</Algorithm>

  <SecretKey ref='private.secretkey'/>

  <IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables> <!-- optional -->

  <!--
    The "message" can include fixed and multiple variable parts,
    including newlines and static functions.
    Whitespace is significant.
   -->
  <Message>Fixed Part
    {a_variable}
    {timeFormatUTCMs(timeFormatString1,system.timestamp)}
    {nonce}
  </Message>

  <!--
    VerificationValue is optional.
    Include it to perform an HMAC check.
  -->
  <VerificationValue encoding='base16' ref='expected_hmac_value'/>

  <!-- default encoding is base64 -->
  <Output encoding='base16'>name_of_variable</Output>

</HMAC>

Вычисление и проверка подписи выполняются по одной и той же процедуре. Правило HMAC вычисляет HMAC и может проверить вычисленную подпись на соответствие ожидаемому значению. Необязательный элемент VerificationValue (если он присутствует) указывает правилу проверить вычисленное значение на соответствие известному или заданному значению.


Сведения об элементах для HMAC

В справочнике по правилам описаны элементы и атрибуты правил HMAC.

Атрибуты, которые применяются к элементу верхнего уровня

<HMAC name="HMAC" continueOnError="false" enabled="true" async="false">

Следующие атрибуты являются общими для всех родительских элементов правил.

Атрибут Описание По умолчанию Присутствие
name Внутреннее название правила. В названии можно использовать только следующие символы: A-Z0-9._\-$ %. Однако в интерфейсе Apigee действуют дополнительные ограничения, например автоматически удаляются символы, не являющиеся буквенно-цифровыми.

При необходимости используйте элемент <displayname></displayname>, чтобы присвоить правилу в редакторе прокси-сервера Apigee другое название на естественном языке.

Н/Д Обязательно
continueOnError Если задано значение false, при сбое правила возвращается ошибка. Это ожидаемое поведение для большинства правил.

Установите значение true, чтобы выполнение потока продолжалось, даже если правило не сработало.

false Необязательно
включено Чтобы применить правило, задайте значение true.

Установите значение false, чтобы отключить правило. Правило не будет применяться, даже если оно прикреплено к потоку.

true Необязательно
асинхронный Этот атрибут больше не поддерживается. false Поддержка прекращена

<Algorithm>

<Algorithm>algorithm-name</Algorithm>

Указывает хеш-алгоритм для вычисления HMAC.

По умолчанию Н/Д
Присутствие Обязательно
Тип Строка
Допустимые значения SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 и MD-5

В конфигурации правил можно указывать названия алгоритмов без учета регистра и с дефисом между буквами и цифрами или без него . Например, SHA256, SHA-256 и sha256 считаются эквивалентными.

<DisplayName>

<DisplayName>Policy Display Name</DisplayName>

Используйте этот атрибут вместе с атрибутом name, чтобы задать для правила в редакторе прокси-серверов Apigee UI другое, более понятное название.

По умолчанию Если вы не укажете этот элемент, будет использовано значение атрибута name правила.
Присутствие Необязательно
Тип Строка

<Message>

<Message>message_template_here</Message>
or
<Message ref='variable_here'/>

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

<Message>Fixed Part
    {a_variable}
    {timeFormatUTCMs(timeFormatString1,system.timestamp)}
    {nonce}
</Message>

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

По умолчанию Н/Д
Присутствие Обязательно
Тип Строка
Допустимые значения В качестве текстового значения можно использовать любую строку. Если вы добавите атрибут ref, он будет иметь приоритет над текстовым значением. Правило оценивает текстовое значение или переменную, на которую оно ссылается, как шаблон сообщения.

<Output>

<Output encoding='encoding_name'>variable_name</Output>

Указывает название переменной, в которую правило должно поместить вычисленное значение HMAC. Также указывает кодировку, которая будет использоваться для вывода.

По умолчанию

Выходная переменная по умолчанию – hmac.POLICYNAME.output.

Значение по умолчанию для атрибута encoding – base64.

Присутствие Необязательное поле. Если этого элемента нет, правило задает переменную потока hmac.POLICYNAME.output со значением, закодированным в формате Base64.
Тип Строка
Допустимые значения

Для кодирования: hex, base16, base64, base64url.

Регистр символов не учитывается. Значения hex и base16 являются синонимами.

Текстовое значение элемента Output может быть любым допустимым именем переменной потока.

<SecretKey>

<SecretKey encoding='encoding_name' ref='private.secretkey'/>

Секретный ключ, используемый для вычисления HMAC. Ключ получается из указанной переменной и декодируется в соответствии с заданной кодировкой.

По умолчанию

Для переменной, на которую ссылается атрибут, не задано значение по умолчанию. Атрибут ref является обязательным.

Если атрибут encoding отсутствует, по умолчанию правило декодирует строку секретного ключа с помощью UTF-8, чтобы получить байты ключа.

Присутствие Обязательно
Тип Строка
Допустимые значения

Для encoding допустимые значения: hex, base16, base64, utf8. По умолчанию используется кодировка UTF8. Регистр символов не учитывается, а дефисы можно не указывать. Base16 – то же самое, что base-16 и bAse16. Base16 и Hex – синонимы.

Атрибут encoding позволяет указать ключ, который содержит байты вне диапазона печатаемых символов UTF-8. Например, предположим, что конфигурация правил включает следующее:

 <SecretKey encoding='hex' ref='private.encodedsecretkey'/>

Предположим, что переменная private.encodedsecretkey содержит строку 536563726574313233.

В этом случае ключевые байты будут декодированы как [53 65 63 72 65 74 31 32 33] (каждый байт представлен в шестнадцатеричном формате). Другой пример: если encoding='base64', а private.encodedsecretkey содержит строку U2VjcmV0MTIz, то в результате для ключа будет получен тот же набор байтов. Если атрибут encoding отсутствует или имеет значение UTF8, строка Secret123 будет преобразована в тот же набор байтов.

<VerificationValue>

<VerificationValue encoding='encoding_name' ref='variable_name'/>
or
<VerificationValue encoding='encoding_name'>string_value</VerificationValue>

Необязательный параметр. Указывает значение проверки, а также алгоритм кодирования, который использовался для кодирования значения проверки. Правило будет использовать этот алгоритм для декодирования значения.

По умолчанию Значение по умолчанию отсутствует. Если элемент присутствует, но атрибут encoding отсутствует, в правиле используется кодировка по умолчанию base64.
Присутствие Необязательно
Тип Строка
Допустимые значения

Допустимые значения атрибута "кодировка": hex, base16, base64, base64url. Регистр символов не учитывается. Значения hex и base16 являются синонимами.

Кодировка элемента VerificationValue может отличаться от кодировки элемента Output.

<IgnoreUnresolvedVariables>

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

Установите значение false, если хотите, чтобы при невозможности определить какую-либо переменную, указанную в правиле, возникала ошибка. Установите значение true, чтобы неразрешимые переменные обрабатывались как пустые строки (null).

Булево значение IgnoreUnresolvedVariables влияет только на переменные, на которые ссылается шаблон сообщения. Хотя SecretKey и VerificationValue могут ссылаться на переменную, обе эти ссылки должны быть разрешимыми, поэтому настройка ignore к ним не применяется.

По умолчанию False
Присутствие Необязательно
Тип Логическое значение
Допустимые значения true или false

Переменные процесса

Правило может задавать эти переменные во время выполнения.

Переменная Описание Пример
hmac.policy_name.message В соответствии с правилом эта переменная будет содержать эффективное сообщение – результат обработки шаблона, указанного в элементе Message. hmac.HMAC-Policy.message = "Hello, World"
hmac.policy_name.output Получает результат вычисления HMAC, если элемент Output не содержит названия переменной. hmac.HMAC-Policy.output = /yyRjydfP+fBHTwXFgc5AZhLAg2kwCri+e35girrGw4=
hmac.policy_name.outputencoding Получает название выходной кодировки. hmac.HMAC-Policy.outputencoding = base64

Справочник по ошибкам

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

Ошибки времени выполнения

Эти ошибки могут возникать при выполнении правил.

Код ошибки Статус HTTP Когда возникает
steps.hmac.UnresolvedVariable 401

Эта ошибка возникает, если переменная, указанная в правиле HMAC,

  • Вне области действия (недоступно в определенном процессе, в котором выполняется правило).

    или

  • Не удается разрешить (не определено)
steps.hmac.HmacVerificationFailed 401 Не удалось проверить HMAC: указанное значение не совпадает с рассчитанным.
steps.hmac.HmacCalculationFailed 401 Правило не смогло рассчитать HMAC.
steps.hmac.EmptySecretKey 401 Значение переменной секретного ключа не указано.
steps.hmac.EmptyVerificationValue 401 Переменная, содержащая значение проверки, пуста.

Ошибки развертывания

Эти ошибки могут возникать при развертывании прокси-сервера, содержащего это правило.

Название ошибки Статус HTTP Когда возникает
steps.hmac.MissingConfigurationElement 401 Эта ошибка возникает, когда отсутствует обязательный элемент или атрибут.
steps.hmac.InvalidValueForElement 401 Эта ошибка возникает, если значение, указанное в элементе Algorithm, не является одним из следующих: SHA-1, SHA-224, SHA-256, SHA-512 или MD-5.
steps.hmac.InvalidSecretInConfig 401 Эта ошибка возникает, если для переменной SecretKey явно задано текстовое значение.
steps.hmac.InvalidVariableName 401 Эта ошибка возникает, если переменная SecretKey не содержит префикс private (private.).

Переменные неисправности

Эти переменные устанавливаются при возникновении ошибки во время выполнения. Дополнительные сведения см. в разделе Что нужно знать об ошибках политики .

Переменные Где Пример
fault.name=" fault_name " fault_name — это имя ошибки, как указано в таблице ошибок времени выполнения выше. Имя неисправности — это последняя часть кода неисправности. fault.name Matches "UnresolvedVariable"
hmac. policy_name .failed Политика устанавливает эту переменную в случае сбоя. hmac.HMAC-Policy.failed = true

Пример ответа об ошибке

Для обработки ошибок лучше всего перехватывать часть errorcode в ответе на ошибку. Не полагайтесь на текст в faultstring , поскольку он может измениться.

Пример правила неисправности

<FaultRules>
    <FaultRule name="HMAC Policy Errors">
        <Step>
            <Name>AM-Unauthorized</Name>
            <Condition>(fault.name Matches "HmacVerificationFailed")</Condition>
        </Step>
        <Condition>hmac.HMAC-1.failed = true</Condition>
    </FaultRule>
</FaultRules>