Zasada HMAC

Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
Informacje

Oblicza i weryfikuje kod HMAC (Hash-based Message Authentication Code). System HMAC, czasem nazywany kluczem uwierzytelniania wiadomości lub haszem, wykorzystuje kryptograficzną funkcję skrótu, taką jak SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 lub MD-5, stosowanej do wiadomości wraz z tajnym kluczem, by utworzyć podpis lub kod uwierzytelniania wiadomości. Termin „wiadomość” odnosi się do dowolnego strumienia bajtów. Nadawca wiadomości może też wysłać kod HMAC do odbiorcy, a odbiorca może użyć HMAC do uwierzytelnienia wiadomości.

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

Sample

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>

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

Przetwarzanie podpisu i weryfikacja podpisu przebiega dokładnie tak samo. Zasada HMAC oblicza HMAC i może opcjonalnie zweryfikować obliczony podpis w odniesieniu do oczekiwanej wartości. Opcjonalny element VerificationValue (jeśli istnieje) nakazuje zasadom sprawdzanie obliczonej wartości w odniesieniu do znanej lub podanej wartości.


Odniesienie do elementu na potrzeby HMAC

Dokumentacja zasad zawiera opis elementów i atrybutów zasad HMAC.

Atrybuty stosowane do elementu najwyższego poziomu

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

Poniższe atrybuty są wspólne dla wszystkich elementów nadrzędnych zasad.

Atrybut Opis Domyślnie Obecność
nazwa Wewnętrzna nazwa zasady. Znaki, których możesz używać w nazwie, są ograniczone do: A-Z0-9._\-$ %. Interfejs Apigee wymusza jednak dodatkowe ograniczenia, takie jak automatyczne usuwanie znaków niealfanumerycznych.

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

Nie dotyczy Wymagane
continueOnError Ustaw wartość false, aby zwracać błąd w przypadku niepowodzenia zasady. Jest to normalne działanie większości zasad.

Ustaw jako true, aby wykonywanie przepływu było kontynuowane nawet po awarii zasady.

false Opcjonalnie
włączone Ustaw jako true, aby wymuszać zasadę.

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

prawda Opcjonalnie
async Ten atrybut został wycofany. false Wycofano

<Algorithm>

<Algorithm>algorithm-name</Algorithm>

Określa algorytm szyfrowania do obliczania HMAC.

Domyślnie 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 zasad akceptuje nazwy algorytmów bez rozróżnienia wielkości liter oraz ze znakiem myślnika 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 oprócz atrybutu name, aby oznaczyć zasadę w edytorze serwera proxy interfejsu Apigee inną nazwą w języku naturalnym.

Domyślnie Jeśli pominiesz ten element, zostanie użyta wartość atrybutu nazwa zasady.
Obecność Opcjonalnie
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 (zastępowanie zmiennych), aby umożliwić uwzględnianie w czasie działania dodatkowych elementów, takich jak sygnatury czasowe, liczby jednorazowe, listy nagłówków i 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 znaki nowego wiersza i funkcje statyczne. Odstępy są istotne.

Domyślnie 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 ocenia wartość tekstową lub wskazaną zmienną jako szablon wiadomości.

<Dane wyjściowe>

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

Określa nazwę zmiennej, którą zasada powinna ustawić za pomocą obliczonej wartości HMAC. Określa też kodowanie danych wyjściowych.

Domyślnie

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

Domyślną wartością atrybutu encoding jest base64.

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

Do kodowania: hex, base16, base64, base64url.

Wielkość liter w wartościach nie jest rozróżniana. hex i base16 to synonimy.

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 tajny klucz używany do obliczania HMAC. Klucz jest odczytywany z wskazanej zmiennej i dekodowany zgodnie z określonym kodowaniem.

Domyślnie

Nie ma wartości domyślnej dla wskazanej zmiennej; atrybut ref jest wymagany.

Jeśli nie ma atrybutu encoding, zasada domyślnie dekoduje ciąg klucza tajnego za pomocą UTF-8 w celu uzyskania bajtów klucza.

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

Prawidłowe wartości dla encoding to hex, base16, base64, utf8. Domyślne kodowanie to UTF-8. Wielkość liter w wartościach nie jest rozróżniana, a myślniki nie mają znaczenia. Pole Base16 jest takie samo jak base-16 i bAse16. Base16 i Hex to synonimy.

Użycie atrybutu kodowania pozwala określić klucz, który zawiera bajty spoza zakresu drukowanych znaków UTF-8. Załóżmy na przykład, że konfiguracja zasad zawiera taki element:

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

A załóżmy, że private.encodedsecretkey zawiera ciąg 536563726574313233.

W tym przypadku bajty klucza zostaną dekodowane jako: [53 65 63 72 65 74 31 32 33] (każdy bajt przedstawiony w postaci szesnastkowej). W innym przykładzie, jeśli encoding='base64' i private.encodedsecretkey zawierają ciąg U2VjcmV0MTIz, otrzymamy ten sam zestaw bajtów dla klucza. Bez atrybutu kodowania lub z atrybutem kodowania o wartości UTF8 wartość ciągu znaków Secret123 dałaby ten sam zbiór bajtów.

<VerificationValue>

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

(Opcjonalnie) Określa wartość weryfikacji, a także algorytm kodowania, który został użyty do zakodowania wartości weryfikacyjnej. Zasada będzie używać tego algorytmu do dekodowania wartości.

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

Prawidłowe wartości atrybutu kodowania to hex, base16, base64, base64url. Wielkość liter w wartościach nie jest rozróżniana. hex i base16 to synonimy.

Kodowanie VerificationValue musi być inne niż kodowanie elementu Output.

<IgnoreUnresolvedVariables>

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

Ustaw jako false, jeśli chcesz, aby zasada zgłaszała błąd, gdy jakakolwiek przywołana zmienna określona w zasadzie jest nierozwiązana. Ustaw jako true, aby traktować każdą nierozwiązaną zmienną jako pusty ciąg znaków (wartość null).

Wartość logiczna ignoreUnresolvedVariables ma wpływ tylko na zmienne, do których odwołuje się szablon wiadomości. Zmienne SecretKey i VerificationValue mogą odwoływać się do zmiennej, ale oba te elementy muszą być możliwe do rozpoznania, więc ustawienie ignore ich nie dotyczy.

Domyślnie Fałsz
Obecność Opcjonalnie
Typ Wartość logiczna
Prawidłowe wartości prawda lub fałsz

Zmienne przepływu

Zasada może ustawiać te zmienne podczas wykonywania.

Zmienna Opis Przykład
hmac.policy_name.message Zasada ustawia tę zmienną z obowiązującą wiadomością, w wyniku oceny szablonu wiadomości określonego w elemencie Message. hmac.HMAC-Policy.message = "Hello, World"
hmac.policy_name.output Pobiera wynik obliczania HMAC, gdy element Output nie zawiera 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, gdy wystąpi błąd środowiska wykonawczego. Więcej informacji znajdziesz w artykule Co musisz wiedzieć o błędach związanych z zasadami.

Zmienne Gdzie Przykład
fault.name="fault_name" fault_name to nazwa błędu podana w tabeli Błędy środowiska wykonawczego powyżej. Nazwa błędu to ostatnia część kodu. fault.name Matches "UnresolvedVariable"
hmac.policy_name.failed Zasada ustawia tę zmienną na wypadek niepowodzenia. hmac.HMAC-Policy.failed = true

Przykładowa odpowiedź na błąd

W przypadku obsługi błędów najlepiej jest zablokować część errorcode odpowiedzi błędu. Nie polegaj na tekście w polu 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>