מדיניות HMAC

מוצג המסמך של Apigee Edge.
עוברים אל מסמכי תיעוד של Apigee X.
מידע

מחשב ומאמת קוד אימות הודעות (HMAC) מבוסס גיבוב. לפעמים שנקרא 'קוד אימות הודעות עם מפְתח' (Keyed Message Authentication Code), או גיבוב (hash) עם קידוד, HMAC משתמש בגיבוב קריפטוגרפי פונקציה כמו SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 או MD-5, שהוחלו על 'הודעה', וגם מפתח סודי, כדי להפיק חתימה או קוד אימות הודעה בהודעה הזו. המונח 'הודעה' לדף הזה מתייחס לכל זרם של בייטים. מי ששולח הודעה יכול גם לשלוח HMAC למקלט, והמקבל יכול להשתמש ב-HMAC כדי לאמת את ההודעה.

למידע נוסף על HMAC: צפייה ב-HMAC: Keyed-Hashing עבור אימות הודעות (rfc2104).

דוגמאות

יצירת 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 ויכולה באופן אופציונלי לאמת את המחושב וחתימה על ערך מצופה. הרכיב האופציונלי ValidValue (אם קיים) מנחה את המדיניות לבדוק את הערך המחושב מול ערך ידוע או נתון עם ערך מסוים.


הפניה לרכיבים ל-HMAC

בחומר העזר בנושא המדיניות מתוארים הרכיבים והמאפיינים של מדיניות HMAC.

מאפיינים החלה על הרכיב ברמה העליונה

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

המאפיינים הבאים משותפים לכל רכיבי ההורה של המדיניות.

מאפיין תיאור ברירת מחדל נוכחות
שם השם הפנימי של המדיניות. תווים שבהם אפשר להשתמש בשם מוגבלים ל: A-Z0-9._\-$ % אבל ממשק המשתמש של Apigee אוכף הגבלות, כגון הסרה אוטומטית של תווים שאינם אלפאנומריים.

אפשר להשתמש ברכיב <displayname></displayname> כדי לתייג את המדיניות בעורך ה-Proxy של ממשק המשתמש של Apigee באמצעות שפה טבעית אחרת שם.

לא רלוונטי חובה
continueOnError צריך להגדיר את הערך false כדי להחזיר שגיאה כשמדיניות נכשלת. המצב הזה צפוי של רוב כללי המדיניות.

יש להגדיר ל-true כדי שביצוע התהליך יימשך גם לאחר המדיניות נכשל.

false אופציונלי
פעיל צריך להגדיר את הערך true כדי לאכוף את המדיניות.

הגדרת הערך false כ'כיבוי' המדיניות. המדיניות לא תיאכף גם אם הוא נשאר מחובר לזרימה.

true אופציונלי
אסינכרוני המאפיין הזה הוצא משימוש. false הוצא משימוש

&lt;Algorithm&gt;

<Algorithm>algorithm-name</Algorithm>

מציינת את אלגוריתם הגיבוב (hash) שיחשב את ה-HMAC.

ברירת מחדל לא רלוונטי
נוכחות חובה
סוג מחרוזת
ערכים חוקיים SHA-1, SHA-224, SHA-256, SHA-384 SHA-512, MD-5

הגדרת המדיניות מקבלת שמות של אלגוריתמים ללא הבחנה בין אותיות רישיות (case-sensitive), וגם עם או בלי הקו המפריד בין האותיות למספרים . לדוגמה, SHA256 וגם SHA-256 וגם sha256 מקבילים.

&lt;DisplayName&gt;

<DisplayName>Policy Display Name</DisplayName>

שימוש בנוסף למאפיין השם כדי להוסיף תווית למדיניות בעורך ה-Proxy של ממשק המשתמש של Apigee בשם אחר בשפה טבעית.

ברירת מחדל אם משמיטים את הרכיב הזה, המערכת תשתמש בערך של מאפיין השם של המדיניות.
נוכחות אופציונלי
סוג מחרוזת

&lt;Message&gt;

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

מציינת את המטען הייעודי (Payload) של ההודעה לחתימה. הקלט של הרכיב הזה תומך תבניות של הודעות (החלפת משתנה) כדי לאפשר הכללה של פריטים נוספים בזמן הריצה, כמו חותמות זמן, צפנים חד-פעמיים, רשימות של כותרות או מידע אחר. לדוגמה:

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

תבנית ההודעה יכולה לכלול חלקים קבועים ומשתנים, כולל שורות חדשות ופונקציות סטטיות. יש חשיבות לרווחים לבנים.

ברירת מחדל לא רלוונטי
נוכחות חובה
סוג מחרוזת
ערכים חוקיים כל מחרוזת חוקית עבור ערך הטקסט. אם מציינים את המאפיין ref, הוא יקבל עדיפות על פני ערך הטקסט. המדיניות מבצעת הערכה של הטקסט או את המשתנה שאליו מפנים כתבנית הודעה.

&lt;Output&gt;

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

זה שם המשתנה שהמדיניות צריכה להגדיר עם ערך ה-HMAC המחושב. מציין גם את הקידוד שישמש לפלט.

ברירת מחדל

משתנה הפלט שמוגדר כברירת מחדל הוא hmac.POLICYNAME.output.

ערך ברירת המחדל של המאפיין encoding הוא base64.

נוכחות זה שינוי אופציונלי. אם הרכיב הזה לא קיים, המדיניות מגדירה את משתנה הזרימה hmac.POLICYNAME.output, עם ערך בקידוד base64.
סוג מחרוזת
ערכים חוקיים

לקידוד, hex, base16, base64, base64url.

הערכים לא תלויי-רישיות; hex ו-base16 הן מילים נרדפות.

ערך הטקסט של הרכיב Output יכול להיות כל שם חוקי של משתנה זרימה.

&lt;SecretKey&gt;

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

מציינת את המפתח הסודי שמשמש לחישוב ה-HMAC. המפתח מתקבל מהקובץ משתנה, מפוענח בהתאם לקידוד הספציפי.

ברירת מחדל

אין ערך ברירת מחדל למשתנה שאליו מפנים; חובה לציין את המאפיין ref.

בהיעדר מאפיין encoding, המדיניות כברירת מחדל מפענח את מחרוזת המפתח הסודי באמצעות UTF-8 כדי לקבל את הבייטים של המפתח.

נוכחות חובה
סוג מחרוזת
ערכים חוקיים

בשביל encoding, הערכים החוקיים הם hex, base16, base64, utf8 ברירת המחדל היא UTF8. הערכים לא תלויי-רישיות, ומקפים זניח. Base16 זהה ל-base-16 ו- bAse16. Base16 ו-Hex הן מילים נרדפות.

השימוש במאפיין קידוד מאפשר לציין מפתח כולל בייטים שנמצאים מחוץ לטווח של תווים בפורמט UTF-8 שניתן להדפיס. לדוגמה, נניח שהגדרת המדיניות כוללת את הדברים הבאים:

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

נניח שהמחרוזת 536563726574313233 נמצאת על ידי private.encodedsecretkey.

במקרה כזה, הבייטים של המפתח יפוענחו כך: [53 65 63 72 65 74 31 32 33] (כל בייט מיוצג בקוד הקסדצימלי). דוגמה נוספת: אם encoding='base64', ו-private.encodedsecretkey מכיל את המחרוזת U2VjcmV0MTIz, התוצאה תהיה את אותה קבוצה של בייטים למפתח. ללא מאפיין קידוד, או עם מאפיין הקידוד UTF8, ערך המחרוזת Secret123 יגרום אותה קבוצת בייטים.

&lt;VerificationValue&gt;

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

&lt;IgnoreUnresolvedVariables&gt;

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

צריך להגדיר את הערך false אם רוצים שהמדיניות תגרור שגיאה כשמצוין משתנה כלשהו שאליו יש הפניה במדיניות לא ניתן לפתור. צריך להגדיר לפרמטר את הערך true כדי להתייחס לכל משתנה שלא ניתן לפתרון כמחרוזת ריקה (null).

הערך הבוליאני ignoreUnresolvedVariables משפיע רק על משתנים שאליהם מתבצעת הפניה תבנית להודעה. SecretKey ו-VerificationValue יכולים להפנות למשתנה, אבל גם מהם צריך להיות פתרון, לכן ההגדרה ignore לא חלה עליהם.

ברירת מחדל לא נכון
נוכחות אופציונלי
סוג בוליאני
ערכים חוקיים נכון או לא נכון

משתני זרימה

המדיניות יכולה להגדיר את המשתנים האלה במהלך הביצוע.

משתנה תיאור דוגמה
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 המשתנה שמכיל את ערך האימות ריק.

שגיאות בפריסה

השגיאות האלה יכולות להתרחש כשפורסים שרת proxy שכולל את המדיניות הזו.

שם השגיאה סטטוס HTTP מופיע כאשר
steps.hmac.MissingConfigurationElement 401 השגיאה הזו מתרחשת כשחסרים רכיב או מאפיין נדרשים.
steps.hmac.InvalidValueForElement 401 השגיאה הזו מופיעה אם הערך שצוין ברכיב האלגוריתם אינו אחד מהערכים הבאים: 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>