Вы просматриваете документацию по 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 действуют дополнительные ограничения, например автоматически удаляются символы, не являющиеся буквенно-цифровыми.
При необходимости используйте элемент |
Н/Д | Обязательно |
| continueOnError |
Если задано значение false, при сбое правила возвращается ошибка. Это ожидаемое поведение для большинства правил.
Установите значение |
false | Необязательно |
| включено |
Чтобы применить правило, задайте значение true.
Установите значение |
true | Необязательно |
| асинхронный | Этот атрибут больше не поддерживается. | false | Поддержка прекращена |
<Algorithm>
<Algorithm>algorithm-name</Algorithm>
Указывает хеш-алгоритм для вычисления HMAC.
| По умолчанию | Н/Д |
| Присутствие | Обязательно |
| Тип | Строка |
| Допустимые значения | SHA-1, SHA-224, SHA-256, SHA-384,
SHA-512 и MD-5
В конфигурации правил можно указывать названия алгоритмов без учета регистра и с дефисом между буквами и цифрами или без него . Например, |
<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 со значением, закодированным в формате Base64. |
| Тип | Строка |
| Допустимые значения | Для кодирования: Регистр символов не учитывается. Значения Текстовое значение элемента |
<SecretKey>
<SecretKey encoding='encoding_name' ref='private.secretkey'/>
Секретный ключ, используемый для вычисления HMAC. Ключ получается из указанной переменной и декодируется в соответствии с заданной кодировкой.
| По умолчанию |
Для переменной, на которую ссылается атрибут, не задано значение по умолчанию. Атрибут Если атрибут |
| Присутствие | Обязательно |
| Тип | Строка |
| Допустимые значения | Для Атрибут encoding позволяет указать ключ, который содержит байты вне диапазона печатаемых символов UTF-8. Например, предположим, что конфигурация правил включает следующее: <SecretKey encoding='hex' ref='private.encodedsecretkey'/>
Предположим, что переменная
В этом случае ключевые байты будут декодированы как [53 65 63 72 65 74 31 32 33] (каждый байт представлен в шестнадцатеричном формате). Другой пример: если |
<VerificationValue>
<VerificationValue encoding='encoding_name' ref='variable_name'/> or <VerificationValue encoding='encoding_name'>string_value</VerificationValue>
Необязательный параметр. Указывает значение проверки, а также алгоритм кодирования, который использовался для кодирования значения проверки. Правило будет использовать этот алгоритм для декодирования значения.
| По умолчанию | Значение по умолчанию отсутствует. Если элемент присутствует, но атрибут encoding отсутствует, в правиле используется кодировка по умолчанию base64. |
| Присутствие | Необязательно |
| Тип | Строка |
| Допустимые значения |
Допустимые значения атрибута "кодировка": Кодировка элемента |
<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 |
Error reference
This section describes the fault codes and error messages that are returned and fault variables that are set by Apigee when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.
Runtime errors
These errors can occur when the policy executes.
| Fault code | HTTP status | Occurs when |
|---|---|---|
steps.hmac.UnresolvedVariable |
401 | This error occurs if a variable specified in the HMAC policy is either:
|
steps.hmac.HmacVerificationFailed |
401 | The HMAC verification failed; the verification value provided does not match the calculated value. |
steps.hmac.HmacCalculationFailed |
401 | The policy was unable to calculate the HMAC. |
steps.hmac.EmptySecretKey |
401 | The value of the secret key variable is empty. |
steps.hmac.EmptyVerificationValue |
401 | The variable holding the verification value is empty. |
Deployment errors
These errors can occur when you deploy a proxy containing this policy.
| Error name | HTTP status | Occurs when |
|---|---|---|
steps.hmac.MissingConfigurationElement |
401 | This error occurs when a required element or attribute is missing. |
steps.hmac.InvalidValueForElement |
401 | This error occurs if the value specified in the Algorithm element is not
one of the following values: SHA-1, SHA-224, SHA-256,
SHA-512, or MD-5. |
steps.hmac.InvalidSecretInConfig |
401 | This error occurs if there is a text value explicitly provided for SecretKey. |
steps.hmac.InvalidVariableName |
401 | This error occurs if the SecretKey variable does not contain the
private prefix (private.). |
Fault variables
These variables are set when a runtime error occurs. For more information, see What you need to know about policy errors.
| Variables | Where | Example |
|---|---|---|
fault.name="fault_name" |
fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. | fault.name Matches "UnresolvedVariable" |
hmac.policy_name.failed |
The policy sets this variable in the case of a failure. | hmac.HMAC-Policy.failed = true |
Example error response
For error handling, the best practice is to trap the errorcode part of the error
response. Do not rely on the text in the faultstring, because it could change.
Example fault rule
<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>