Zasada HMAC

Wyświetlasz dokumentację Apigee Edge.
Przejdź do dokumentacji Apigee X.
info

Oblicza i weryfikuje kod uwierzytelniania wiadomości przy użyciu wartości hash (HMAC). HMAC, czasami nazywany kodem uwierzytelniania wiadomości przy użyciu wartości hash w formie klucza lub kodem uwierzytelniania wiadomości przy użyciu wartości hash w formie klucza, używa kryptograficznej funkcji skrótu, takiej jak SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 lub MD-5, stosowanej do "wiadomości" wraz z kluczem tajnym, aby wygenerować podpis lub kod uwierzytelniania wiadomości. Termin "wiadomość" odnosi się tutaj do dowolnego strumienia bajtów. Nadawca wiadomości może też wysłać do odbiorcy kod HMAC, a odbiorca może go użyć do uwierzytelnienia wiadomości.

Więcej informacji o HMAC, znajdziesz w dokumencie HMAC: Keyed-Hashing for Message Authentication (rfc2104).

Przykłady

Generowanie 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>

Weryfikowanie 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>

Obliczanie podpisu i jego weryfikacja przebiegają dokładnie tak samo proces. Zasada HMAC oblicza kod HMAC i opcjonalnie może zweryfikować obliczony podpis z oczekiwaną wartością. Opcjonalny element `VerificationValue` (jeśli występuje) nakazuje zasadzie sprawdzenie obliczonej wartości z znaną lub podaną wartością.


Dokumentacja elementu HMAC

Dokumentacja zasady opisuje elementy i atrybuty zasady HMAC.

Atrybuty, które mają zastosowanie do elementu najwyższego poziomu

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

Te atrybuty są wspólne dla wszystkich elementów nadrzędnych zasad.

Atrybut Opis Domyślna Obecność
name Wewnętrzna nazwa zasady. W nazwie można używać tylko tych znaków: A-Z0-9._\-$ %. Interfejs Apigee wymusza jednak dodatkowe ograniczenia, np. automatycznie usuwa znaki, które nie są alfanumeryczne.

Opcjonalnie możesz użyć elementu <displayname></displayname>, aby oznaczyć zasadę w edytorze proxy w interfejsie Apigee inną nazwą w języku naturalnym.

Nie dotyczy Wymagane
continueOnError Ustaw wartość false, aby zwracać błąd, gdy zasada nie działa. Jest to oczekiwane zachowanie w przypadku większości zasad.

Ustaw wartość true, aby wykonanie przepływu było kontynuowane nawet po niepowodzeniu zasady.

fałsz Opcjonalny
enabled Ustaw wartość true, aby wymusić stosowanie zasady.

Ustaw wartość false, aby „wyłączyć” zasadę. Zasada nie będzie egzekwowana nawet jeśli pozostanie dołączona do przepływu.

prawda Opcjonalny
async Ten atrybut został wycofany. fałsz Wycofano

<Algorithm>

<Algorithm>algorithm-name</Algorithm>

Określa algorytm skrótu do obliczania HMAC.

Domyślna Nie dotyczy
Obecność Wymagane
Typ Ciąg znaków
Prawidłowe wartości SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, i MD-5

Konfiguracja zasady akceptuje nazwy algorytmów bez rozróżniania wielkości liter oraz z łącznikiem między literami i cyframi lub bez niego . Na przykład SHA256, SHA-256 i sha256 są równoważne.

<DisplayName>

<DisplayName>Policy Display Name</DisplayName>

Użyj tego atrybutu oprócz atrybutu name, aby oznaczyć zasadę w edytorze proxy w interfejsie Apigee inną nazwą w języku naturalnym.

Domyślna Jeśli pominiesz ten element, zostanie użyta wartość atrybutu name zasady.
Obecność Opcjonalny
Typ Ciąg znaków

<Message>

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

Określa ładunek wiadomości do podpisania. Dane wejściowe tego elementu obsługują szablony wiadomości (podstawianie zmiennych), aby umożliwić dołączanie dodatkowych elementów w czasie działania, takich jak sygnatury czasowe, nonce, listy nagłówków lub inne informacje. Na przykład:

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

Szablon wiadomości może zawierać stałe i zmienne części, w tym nowe wiersze i funkcje statyczne. Białe znaki mają znaczenie.

Domyślna Nie dotyczy
Obecność Wymagane
Typ Ciąg znaków
Prawidłowe wartości Wartością tekstową może być dowolny ciąg znaków. Jeśli podasz atrybut ref, będzie on miał pierwszeństwo przed wartością tekstową. Zasada traktuje wartość tekstową lub zmienną, do której się odwołuje, jako szablon wiadomości.

<Output>

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

Określa nazwę zmiennej, którą zasada powinna ustawić na obliczoną wartość HMAC. Określa też kodowanie, które ma być używane w przypadku danych wyjściowych.

Domyślna

Domyślna zmienna wyjściowa to hmac.POLICYNAME.output.

Domyślna wartość atrybutu encoding to base64.

Obecność Opcjonalny. Jeśli ten element nie jest obecny, zasada ustawia zmienną przepływu hmac.POLICYNAME.output, z wartością zakodowaną w formacie base64.
Typ Ciąg znaków
Prawidłowe wartości

W przypadku kodowania: hex, base16, base64, base64url.

Wartości nie uwzględniają wielkości liter. hex i base16 są synonimami.

Wartością tekstową elementu Output może być dowolna prawidłowa nazwa zmiennej przepływu.

<SecretKey>

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

Określa klucz tajny używany do obliczania HMAC. Klucz jest pobierany z zmiennej, do której się odwołuje , i dekodowany zgodnie z określonym kodowaniem.

Domyślna

W przypadku zmiennej, do której się odwołuje, nie ma wartości domyślnej. Atrybut ref jest wymagany.

Jeśli nie ma atrybutu encoding, zasada domyślnie dekoduje ciąg klucza tajnego za pomocą UTF-8, aby uzyskać bajty klucza.

Obecność Wymagane
Typ Ciąg znaków
Prawidłowe wartości

W przypadku encoding prawidłowe wartości to hex, base16, base64, utf8. Domyślne kodowanie to UTF8. Wartości nie uwzględniają wielkości liter, a łączniki nie mają znaczenia. Base16 jest takie samo jak base-16 i bAse16. Base16 i Hex są synonimami.

Użycie atrybutu encoding pozwala określić klucz, który zawiera bajty spoza zakresu znaków drukowalnych UTF-8. Załóżmy na przykład, że konfiguracja zasady zawiera te elementy:

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

Załóżmy też, że private.encodedsecretkey zawiera ciąg znaków 536563726574313233.

W takim przypadku bajty klucza zostaną zdekodowane jako: [53 65 63 72 65 74 31 32 33] (każdy bajt jest reprezentowany w postaci szesnastkowej). Inny przykład: jeśli encoding='base64', i private.encodedsecretkey zawiera ciąg znaków U2VjcmV0MTIz, spowoduje to uzyskanie tego samego zestawu bajtów klucza. Jeśli nie ma atrybutu encoding, lub atrybut encoding ma wartość UTF8, ciąg znaków Secret123 spowoduje uzyskanie tego samego zestawu bajtów.

<VerificationValue>

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

(Opcjonalnie) Określa wartość weryfikacji oraz algorytm kodowania, który został użyty do zakodowania tej wartości. Zasada użyje tego algorytmu do zdekodowania wartości.

Domyślna Nie ma domyślnej wartości weryfikacji. Jeśli element jest obecny, ale brakuje atrybutu encoding, zasada używa domyślnego kodowania base64.
Obecność Opcjonalny
Typ Ciąg znaków
Prawidłowe wartości

Prawidłowe wartości atrybutu encoding to: hex, base16, base64, base64url. Wartości nie uwzględniają wielkości liter. hex i base16 są synonimami.

Kodowanie elementu VerificationValue nie musi być takie samo jak kodowanie używane w przypadku elementu Output.

<IgnoreUnresolvedVariables>

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

Ustaw wartość false, jeśli chcesz, aby zasada zgłaszała błąd, gdy nie można rozpoznać żadnej zmiennej, do której się odwołuje. Ustaw wartość true, aby traktować każdą nierozpoznawalną zmienną jako pusty ciąg znaków (null).

Wartość logiczna IgnoreUnresolvedVariables wpływa tylko na zmienne, do których odwołuje się szablon wiadomości. Zarówno SecretKey jak i VerificationValue mogą odwoływać się do zmiennej, ale obie muszą być rozpoznawalne, więc ustawienie ignore nie ma do nich zastosowania.

Domyślna Fałsz
Obecność Opcjonalny
Typ Wartość logiczna
Prawidłowe wartości true or false

Zmienne przepływu

Podczas wykonywania zasada może ustawiać te zmienne.

Zmienna Opis Przykład
hmac.policy_name.message Zasada ustawia tę zmienną na efektywną wiadomość, czyli wynik oceny szablonu wiadomości określonego w elemencie Message. hmac.HMAC-Policy.message = "Hello, World"
hmac.policy_name.output Pobiera wynik obliczenia HMAC, gdy element Output nie określa nazwy zmiennej. hmac.HMAC-Policy.output = /yyRjydfP+fBHTwXFgc5AZhLAg2kwCri+e35girrGw4=
hmac.policy_name.outputencoding Pobiera nazwę kodowania wyjściowego. hmac.HMAC-Policy.outputencoding = base64

Informacje o błędach

W tej sekcji opisujemy kody błędów i komunikaty o błędach, które są zwracane, a także zmienne błędów ustawiane przez Apigee, gdy ta zasada wywołuje błąd. Te informacje są ważne, jeśli opracowujesz reguły dotyczące błędów do obsługi takich błędów. Więcej informacji znajdziesz w sekcjach Co musisz wiedzieć o błędach zasad i Postępowanie w przypadku błędów.

Błędy w czasie wykonywania

Te błędy mogą wystąpić podczas wykonywania zasady.

Kod błędu Stan HTTP Występuje, gdy
steps.hmac.UnresolvedVariable 401

Ten błąd występuje, jeśli zmienna określona w zasadzie HMAC:

  • Poza zakresem (niedostępne w konkretnym procesie, w którym jest wykonywana zasada)

    lub

  • Nie można rozwiązać (nie określono)
steps.hmac.HmacVerificationFailed 401 Weryfikacja HMAC nie powiodła się. Podana wartość weryfikacji nie pasuje do obliczonej wartości.
steps.hmac.HmacCalculationFailed 401 Nie udało się obliczyć wartości HMAC.
steps.hmac.EmptySecretKey 401 Wartość zmiennej klucza obiektu tajnego jest pusta.
steps.hmac.EmptyVerificationValue 401 Zmienna przechowująca wartość weryfikacji jest pusta.

Błędy wdrażania

Te błędy mogą wystąpić podczas wdrażania serwera proxy zawierającego te zasady.

Nazwa błędu Stan HTTP Występuje, gdy
steps.hmac.MissingConfigurationElement 401 Ten błąd występuje, gdy brakuje wymaganego elementu lub atrybutu.
steps.hmac.InvalidValueForElement 401 Ten błąd występuje, jeśli wartość określona w elemencie algorytmu nie jest jedną z tych wartości: SHA-1, SHA-224, SHA-256, SHA-512 lub MD-5.
steps.hmac.InvalidSecretInConfig 401 Ten błąd występuje, jeśli w polu SecretKey podano jawnie wartość tekstową.
steps.hmac.InvalidVariableName 401 Ten błąd występuje, jeśli zmienna SecretKey nie zawiera prefiksu private (private.).

Zmienne błędów

Te zmienne są ustawiane po wystąpieniu błędu działania. Aby dowiedzieć się więcej, Więcej informacji znajdziesz w sekcji Co musisz wiedzieć o błędach związanych z naruszeniem zasad.

Zmienne Gdzie Przykład
fault.name="fault_name" fault_name to nazwa błędu podana w tabeli tabeli Błędy czasu działania powyżej. Nazwa błędu jest ostatnia który jest częścią kodu błędu. fault.name Matches "UnresolvedVariable"
hmac.policy_name.failed Zasada ustawia tę zmienną w przypadku niepowodzenia. hmac.HMAC-Policy.failed = true

Przykładowa odpowiedź na błąd

W przypadku obsługi błędów sprawdzoną metodą jest przechwycenie części błędu errorcode. . Nie polegaj na tekście zawartym w pliku faultstring, ponieważ może się on zmienić.

Przykładowa reguła błędu

<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>