HMAC नीति

आपको Apigee Edge का दस्तावेज़ दिख रहा है.
Apigee X के दस्तावेज़ पर जाएं.
जानकारी

यह हैश पर आधारित मैसेज ऑथेंटिकेशन कोड (एचएमएसी) की गणना करता है और उसकी पुष्टि करता है. कभी-कभी इसे कीड मैसेज ऑथेंटिकेशन कोड या कीड हैश भी कहा जाता है. एचएमएसी, क्रिप्टोग्राफ़िक हैश फ़ंक्शन का इस्तेमाल करता है. जैसे, SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 या MD-5. इसे "मैसेज" पर लागू किया जाता है. साथ ही, एक सीक्रेट कुंजी का इस्तेमाल करके, उस मैसेज पर हस्ताक्षर या मैसेज ऑथेंटिकेशन कोड जनरेट किया जाता है. यहां "मैसेज" का मतलब, बाइट की किसी भी स्ट्रीम से है. मैसेज भेजने वाला व्यक्ति, मैसेज पाने वाले व्यक्ति को एचएमएसी भी भेज सकता है. मैसेज पाने वाला व्यक्ति, मैसेज की पुष्टि करने के लिए एचएमएसी का इस्तेमाल कर सकता है.

एचएमएसी के बारे में ज़्यादा जानने के लिए, HMAC: Keyed-Hashing for 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 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>

हस्ताक्षर की गणना और उस हस्ताक्षर की पुष्टि करने की प्रोसेस एक जैसी होती है. एचएमएसी नीति, एचएमएसी की गणना करती है. साथ ही, यह गणना किए गए हस्ताक्षर की पुष्टि, अनुमानित वैल्यू के हिसाब से कर सकती है. हालांकि, ऐसा करना ज़रूरी नहीं है. VerificationValue एलिमेंट (अगर मौजूद है) नीति को यह निर्देश देता है कि वह कैलकुलेट की गई वैल्यू की तुलना, जानी-पहचानी या दी गई वैल्यू से करे.


एचएमएसी के लिए एलिमेंट रेफ़रंस

नीति के रेफ़रंस में, एचएमएसी नीति के एलिमेंट और एट्रिब्यूट के बारे में बताया गया है.

ऐसे एट्रिब्यूट जो टॉप-लेवल एलिमेंट पर लागू होते हैं

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

नीति के सभी पैरंट एलिमेंट में ये एट्रिब्यूट एक जैसे होते हैं.

एट्रिब्यूट ब्यौरा डिफ़ॉल्ट उपलब्धता
नाम नीति का इंटरनल नाम. नाम में सिर्फ़ इन वर्णों का इस्तेमाल किया जा सकता है: A-Z0-9._\-$ %. हालांकि, Apigee के यूज़र इंटरफ़ेस (यूआई) में कुछ और पाबंदियां लागू होती हैं. जैसे, अक्षरों और अंकों के अलावा अन्य वर्णों को अपने-आप हटा दिया जाता है.

इसके अलावा, <displayname></displayname> एलिमेंट का इस्तेमाल करके, Apigee UI प्रॉक्सी एडिटर में नीति को किसी दूसरे नाम से लेबल किया जा सकता है. यह नाम, सामान्य भाषा में होना चाहिए.

लागू नहीं ज़रूरी है
continueOnError नीति के उल्लंघन की वजह से गड़बड़ी होने पर, इसे false पर सेट करें. ज़्यादातर नीतियों के लिए, ऐसा होना आम बात है.

इस विकल्प को true पर सेट करें, ताकि नीति के उल्लंघन के बाद भी फ़्लो का एक्ज़ीक्यूशन जारी रहे.

गलत वैकल्पिक
चालू किया गया नीति लागू करने के लिए, इसे true पर सेट करें.

नीति को "बंद करें" के लिए, false पर सेट करें. अगर यह नीति किसी फ़्लो से जुड़ी रहती है, तब भी इसे लागू नहीं किया जाएगा.

सही वैकल्पिक
एक साथ काम नहीं करने वाली प्रोसेस यह एट्रिब्यूट अब काम नहीं करता. गलत बहिष्कृत

<Algorithm>

<Algorithm>algorithm-name</Algorithm>

इससे एचएमएसी का हिसाब लगाने के लिए, हैश एल्गोरिदम के बारे में पता चलता है.

डिफ़ॉल्ट लागू नहीं
उपलब्धता ज़रूरी है
समस्या स्ट्रिंग
मान्य वैल्यू SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, और MD-5

नीति कॉन्फ़िगरेशन में, केस के अंतर के बिना एल्गोरिदम के नाम स्वीकार किए जाते हैं. साथ ही, अक्षरों और संख्याओं के बीच डैश के साथ या उसके बिना भी नाम स्वीकार किए जाते हैं. उदाहरण के लिए, SHA256, SHA-256, और sha256 एक जैसे हैं.

<DisplayName>

<DisplayName>Policy Display Name</DisplayName>

इस एट्रिब्यूट का इस्तेमाल, Apigee के यूज़र इंटरफ़ेस (यूआई) के प्रॉक्सी एडिटर में नीति को लेबल करने के लिए, नाम एट्रिब्यूट के साथ किया जाता है. इससे नीति को किसी दूसरे नाम से लेबल किया जा सकता है.

डिफ़ॉल्ट इस एलिमेंट को शामिल न करने पर, नीति के नाम एट्रिब्यूट की वैल्यू का इस्तेमाल किया जाता है.
उपलब्धता वैकल्पिक
समस्या स्ट्रिंग

<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.POLICYNAME.output है.

encoding एट्रिब्यूट की डिफ़ॉल्ट वैल्यू base64 है.

उपलब्धता ज़रूरी नहीं. अगर यह एलिमेंट मौजूद नहीं है, तो नीति, फ़्लो वैरिएबल hmac.POLICYNAME.output को base64-encoded वैल्यू के साथ सेट करती है.
समस्या स्ट्रिंग
मान्य वैल्यू

एन्कोडिंग के लिए, hex, base16, base64, base64url.

वैल्यू केस-इनसेंसिटिव होती हैं. hex और base16 एक जैसे हैं.

Output एलिमेंट की टेक्स्ट वैल्यू, फ़्लो वैरिएबल का कोई भी मान्य नाम हो सकती है.

<SecretKey>

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

एचएमएसी का हिसाब लगाने के लिए इस्तेमाल की गई सीक्रेट कुंजी के बारे में बताता है. कुंजी को रेफ़र किए गए वैरिएबल से हासिल किया जाता है. इसे खास एन्कोडिंग के हिसाब से डिकोड किया जाता है.

डिफ़ॉल्ट

रेफ़र किए गए वैरिएबल के लिए कोई डिफ़ॉल्ट वैल्यू नहीं है; ref एट्रिब्यूट ज़रूरी है.

encoding एट्रिब्यूट मौजूद न होने पर, नीति डिफ़ॉल्ट रूप से सीक्रेट कुंजी स्ट्रिंग को UTF-8 के साथ डिकोड करती है, ताकि कुंजी बाइट मिल सकें.

उपलब्धता ज़रूरी है
समस्या स्ट्रिंग
मान्य वैल्यू

encoding के लिए, मान्य वैल्यू hex, base16, base64, utf8 हैं. डिफ़ॉल्ट रूप से, यह UTF8 पर सेट होता है. वैल्यू केस-इनसेंसिटिव होती हैं. साथ ही, डैश का कोई मतलब नहीं होता. Base16, base-16 और bAse16 के बराबर है. Base16 और Hex समानार्थी शब्द हैं.

encoding एट्रिब्यूट का इस्तेमाल करके, ऐसी कुंजी तय की जा सकती है जिसमें 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 से बाइट का एक ही सेट मिलेगा.

<VerificationValue>

<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 एलिमेंट के लिए इस्तेमाल की गई एन्कोडिंग के जैसी हो.

<IgnoreUnresolvedVariables>

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

अगर आपको नीति में बताए गए किसी भी वैरिएबल को हल न कर पाने पर, नीति से गड़बड़ी का मैसेज पाना है, तो इसे false पर सेट करें. true पर सेट करें, ताकि किसी भी ऐसे वैरिएबल को खाली स्ट्रिंग (शून्य) के तौर पर माना जा सके जिसे हल नहीं किया जा सकता.

IgnoreUnresolvedVariables बूलियन का असर सिर्फ़ उन वैरिएबल पर पड़ता है जिन्हें मैसेज टेंप्लेट में रेफ़र किया गया है. SecretKey और VerificationValue, दोनों किसी वैरिएबल को रेफ़रंस कर सकते हैं. हालांकि, इन दोनों को हल किया जाना चाहिए, ताकि ignore सेटिंग इन पर लागू न हो.

डिफ़ॉल्ट गलत
उपलब्धता वैकल्पिक
समस्या बूलियन
मान्य वैल्यू सही या गलत

फ़्लो वैरिएबल

नीति, लागू होने के दौरान इन वैरिएबल को सेट कर सकती है.

वैरिएबल ब्यौरा उदाहरण
hmac.policy_name.message नीति, इस वैरिएबल को असरदार मैसेज के साथ सेट करती है. यह Message एलिमेंट में दिए गए मैसेज टेंप्लेट का आकलन करने का नतीजा होता है. hmac.HMAC-Policy.message = "Hello, World"
hmac.policy_name.output जब Output एलिमेंट में वैरिएबल का नाम नहीं दिया जाता है, तब यह एचएमएसी कंप्यूटेशन का नतीजा दिखाता है. hmac.HMAC-Policy.output = /yyRjydfP+fBHTwXFgc5AZhLAg2kwCri+e35girrGw4=
hmac.policy_name.outputencoding इससे आउटपुट एन्कोडिंग का नाम मिलता है. hmac.HMAC-Policy.outputencoding = base64

गड़बड़ी का रेफ़रंस

इस सेक्शन में, गड़बड़ी के कोड और दिखाए गए गड़बड़ी के मैसेज के बारे में बताया गया है. साथ ही, इस नीति से किसी गड़बड़ी को ट्रिगर करने पर Apigee की ओर से सेट किए गए, गड़बड़ी के वैरिएबल के बारे में बताया गया है. यह जानकारी जानना ज़रूरी है कि क्या गड़बड़ियों को ठीक करने के लिए, गड़बड़ी से जुड़े नियम बनाए जा रहे हैं. ज़्यादा जानने के लिए, नीति से जुड़ी गड़बड़ियों के बारे में आपके लिए ज़रूरी जानकारी और गड़बड़ियों को ठीक करने के तरीके देखें.

रनटाइम से जुड़ी गड़बड़ियां

नीति के लागू होने पर ये गड़बड़ियां हो सकती हैं.

गड़बड़ी का कोड एचटीटीपी कोड स्थिति कब होता है
steps.hmac.UnresolvedVariable 401

यह गड़बड़ी तब होती है, जब एचएमएसी नीति में बताया गया कोई वैरिएबल:

  • दायरे से बाहर है (यह सुविधा उस फ़्लो में उपलब्ध नहीं होती जहां नीति लागू की जा रही है)

    या

  • रिज़ॉल्व नहीं किया जा सकता (तय नहीं किया गया है)
steps.hmac.HmacVerificationFailed 401 एचएमएसी पुष्टि नहीं हो सकी; पुष्टि करने के लिए दिया गया मान, दिए गए मान से मेल नहीं खाता है.
steps.hmac.HmacCalculationFailed 401 नीति एचएमएसी की गिनती नहीं कर सकी.
steps.hmac.EmptySecretKey 401 सीक्रेट कुंजी वैरिएबल की वैल्यू खाली है.
steps.hmac.EmptyVerificationValue 401 पुष्टि करने की वैल्यू रखने वाला वैरिएबल खाली है.

डिप्लॉयमेंट से जुड़ी गड़बड़ियां

ये गड़बड़ियां तब हो सकती हैं, जब इस नीति वाले किसी प्रॉक्सी को डिप्लॉय किया जाता है.

गड़बड़ी का नाम एचटीटीपी कोड स्थिति कब होता है
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>