นโยบาย HMAC

คุณกำลังดูเอกสารประกอบ Apigee Edge
ไปที่ เอกสารประกอบเกี่ยวกับ Apigee X.
ข้อมูล

ประมวลผลและยืนยันรหัสการตรวจสอบสิทธิ์ข้อความแบบแฮช (HMAC) บางครั้ง HMAC จะใช้แฮชแบบเข้ารหัสที่เรียกว่ารหัสการตรวจสอบสิทธิ์ข้อความคีย์หรือแฮชที่มีคีย์ เช่น SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 หรือ MD-5 พร้อมกับรหัสลับ เพื่อสร้างลายเซ็นหรือรหัสการตรวจสอบสิทธิ์ข้อความในข้อความนั้น คำว่า "ข้อความ" ที่นี่ หมายถึงสตรีมของไบต์ใดก็ได้ ผู้ส่งข้อความจะส่ง HMAC ไปยังผู้รับได้ด้วย และผู้รับสามารถใช้ HMAC เพื่อตรวจสอบสิทธิ์ข้อความ

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ HMAC ดู HMAC: การแฮชด้วยคีย์ สำหรับ Message Authentication (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 และสามารถเลือกยืนยันการประมวลผล ลายเซ็นกับค่าที่คาดไว้ องค์ประกอบ VerificationValue ที่ไม่บังคับ (หากมี) กําหนดให้นโยบายตรวจสอบค่าที่คำนวณแล้วเทียบกับค่าที่ทราบหรือระบุไว้


การอ้างอิงองค์ประกอบสำหรับ HMAC

ข้อมูลอ้างอิงของนโยบายอธิบายองค์ประกอบและแอตทริบิวต์ของนโยบาย HMAC

แอตทริบิวต์ที่ ใช้กับองค์ประกอบระดับบนสุด

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

แอตทริบิวต์ต่อไปนี้มีอยู่ในองค์ประกอบระดับบนสุดของนโยบายทั้งหมด

แอตทริบิวต์ คำอธิบาย ค่าเริ่มต้น การตรวจหาบุคคล
ชื่อ ชื่อภายในของนโยบาย อักขระที่คุณสามารถใช้ในชื่อจะถูกจำกัดไว้เฉพาะ: A-Z0-9._\-$ % แต่ UI ของ Apigee จะบังคับใช้เพิ่มเติม เช่น การนำอักขระที่ไม่ใช่ตัวอักษรและตัวเลขคละกันออกโดยอัตโนมัติ

(ไม่บังคับ) ใช้องค์ประกอบ <displayname></displayname> เพื่อ ติดป้ายกำกับนโยบายในเครื่องมือแก้ไขพร็อกซี UI ของ Apigee ด้วยภาษาธรรมชาติที่แตกต่างกัน ชื่อ

ไม่มี ต้องระบุ
continueOnError ตั้งค่าเป็น false เพื่อแสดงผลข้อผิดพลาดเมื่อนโยบายล้มเหลว เป็นเรื่องปกติ พฤติกรรมสำหรับนโยบายส่วนใหญ่

ตั้งค่าเป็น true เพื่อให้ดำเนินการตามขั้นตอนได้อย่างต่อเนื่องแม้จะมีนโยบายแล้วก็ตาม ล้มเหลว

เท็จ ไม่บังคับ
เปิดใช้อยู่ ตั้งค่าเป็น true เพื่อบังคับใช้นโยบาย

ตั้งค่าเป็น false เป็น "ปิด" นโยบาย นโยบายนี้จะไม่บังคับใช้ แม้ว่าจะยังมีการเคลื่อนไหว

จริง ไม่บังคับ
ไม่พร้อมกัน แอตทริบิวต์นี้เลิกใช้งานแล้ว เท็จ เลิกใช้

&lt;Algorithm&gt;

<Algorithm>algorithm-name</Algorithm>

ระบุอัลกอริทึมแฮชเพื่อคํานวณ HMAC

ค่าเริ่มต้น ไม่มี
การตรวจหาบุคคล ต้องระบุ
ประเภท สตริง
ค่าที่ถูกต้อง SHA-1 SHA-224 SHA-256 SHA-384 SHA-512 และ MD-5

การกำหนดค่านโยบายจะยอมรับชื่ออัลกอริทึมโดยไม่มีการแยกตัวพิมพ์เล็กและใหญ่ และ มีหรือไม่มี ขีดระหว่างตัวอักษรและตัวเลข เช่น SHA256 และ SHA-256 และ sha256 เทียบเท่ากัน

&lt;DisplayName&gt;

<DisplayName>Policy Display Name</DisplayName>

ใช้เพิ่มเติมจากแอตทริบิวต์ชื่อเพื่อติดป้ายกำกับนโยบายในตัวแก้ไขพร็อกซี UI ของ Apigee ด้วยชื่อที่เป็นภาษาธรรมชาติต่างกัน

ค่าเริ่มต้น หากคุณไม่ใส่องค์ประกอบนี้ ระบบจะใช้ค่าของแอตทริบิวต์ชื่อนโยบาย
การตรวจหาบุคคล ไม่บังคับ
ประเภท สตริง

&lt;Message&gt;

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

ระบุเพย์โหลดของข้อความที่จะเซ็น อินพุตขององค์ประกอบนี้สนับสนุน เทมเพลตข้อความ (การแทนที่ตัวแปร) เพื่ออนุญาตให้มีการรวมรายการเพิ่มเติมขณะรันไทม์ เช่น การประทับเวลา, nonces, รายการของ หรือข้อมูลอื่นๆ เช่น

<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 ซึ่งมีค่าที่เข้ารหัสฐาน 64
ประเภท สตริง
ค่าที่ถูกต้อง

สำหรับการเข้ารหัส 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'/>

และสมมติว่า private.encodedsecretkey มีสตริง 536563726574313233

ในกรณีนี้ ไบต์คีย์จะถอดรหัสเป็น [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)

บูลีน ignoreUnresolvedVariable จะส่งผลต่อตัวแปรที่อ้างอิงโดยค่า เทมเพลตข้อความ แม้ว่า SecretKey และ VerificationValue จะอ้างอิงตัวแปรได้ ซึ่งทั้ง 2 อย่าง ส่วนขยายทั้งหมดต้องแก้ไขได้ ดังนั้นการตั้งค่า 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 ตัวแปรที่มีค่าการยืนยันว่างเปล่า

ข้อผิดพลาดในการทำให้ใช้งานได้

ข้อผิดพลาดเหล่านี้อาจเกิดขึ้นเมื่อคุณใช้พร็อกซีที่มีนโยบายนี้

ชื่อข้อผิดพลาด สถานะ 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>