Chính sách về HMAC

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến Tài liệu về Apigee X.
thông tin

Tính toán và xác minh Mã xác thực thông báo dựa trên hàm băm (HMAC). Thỉnh thoảng được gọi là Mã xác thực thông điệp được khoá hoặc hàm băm có khoá, HMAC sử dụng hàm băm mật mã như SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 hoặc MD-5 được áp dụng cho một "thông báo" cùng với một khoá bí mật, để tạo chữ ký hoặc mã xác thực thư trên thư đó. Từ khoá "tin nhắn" vào đây tham chiếu đến bất kỳ luồng byte nào. Người gửi thông báo cũng có thể gửi HMAC đến người nhận, và người nhận có thể sử dụng HMAC để xác thực thông báo.

Để tìm hiểu thêm về HMAC, xem HMAC: Keyed-Hahash cho Xác thực Thư (rfc2104).

Mẫu

Tạo 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>

Xác minh 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>

Việc tính toán chữ ký và xác minh chữ ký đó thực hiện giống hệt nhau của chúng tôi. Chính sách HMAC tính toán HMAC và có thể tuỳ ý xác minh HMAC với một giá trị dự kiến. Phần tử VerifyValue không bắt buộc (nếu có) hướng dẫn chính sách kiểm tra giá trị đã tính so với giá trị đã biết hoặc đã cho giá trị.


Tham chiếu phần tử cho HMAC

Tài liệu tham khảo chính sách mô tả các thành phần và thuộc tính của chính sách HMAC.

Những thuộc tính mà áp dụng cho phần tử cấp cao nhất

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

Các thuộc tính sau đây áp dụng chung cho tất cả phần tử mẹ của chính sách.

Thuộc tính Nội dung mô tả Mặc định Sự hiện diện
tên Tên nội bộ của chính sách. Bạn chỉ có thể sử dụng các ký tự trong tên này: A-Z0-9._\-$ %. Tuy nhiên, giao diện người dùng Apigee thực thi thêm các hạn chế cụ thể, chẳng hạn như tự động xoá các ký tự không phải là chữ và số.

Bạn có thể dùng phần tử <displayname></displayname> để (không bắt buộc) gắn nhãn chính sách bằng một ngôn ngữ tự nhiên khác trong trình chỉnh sửa proxy của giao diện người dùng Apigee .

Không áp dụng Bắt buộc
continueOnError Đặt thành false để trả về lỗi khi chính sách không thành công. Điều này là dự kiến đối với hầu hết các chính sách.

Đặt thành true để tiếp tục thực thi luồng ngay cả sau khi có chính sách không thành công.

false Không bắt buộc
đang bật Hãy đặt thành true để thực thi chính sách này.

Đặt thành false để "tắt" chính sách. Chính sách này sẽ không được thực thi ngay cả khi đoạn mã vẫn được liên kết với một luồng.

đúng Không bắt buộc
không đồng bộ Thuộc tính này không được dùng nữa. false Không được dùng nữa

&lt;Algorithm&gt;

<Algorithm>algorithm-name</Algorithm>

Chỉ định thuật toán băm để tính HMAC.

Mặc định Không áp dụng
Sự hiện diện Bắt buộc
Loại Chuỗi
Giá trị hợp lệ SHA-1, SHA-224, SHA-256, SHA-384, SHA-512MD-5

Cấu hình chính sách chấp nhận tên thuật toán mà không phân biệt chữ hoa chữ thường, và có hoặc không có dấu gạch ngang giữa các chữ cái và số . Ví dụ: SHA256, SHA-256sha256 đều tương đương.

&lt;DisplayName&gt;

<DisplayName>Policy Display Name</DisplayName>

Sử dụng cùng với thuộc tính name để gắn nhãn chính sách trong trình chỉnh sửa proxy giao diện người dùng Apigee bằng một tên ngôn ngữ tự nhiên khác.

Mặc định Nếu bạn bỏ qua phần tử này, hệ thống sẽ sử dụng giá trị của thuộc tính tên của chính sách.
Sự hiện diện Không bắt buộc
Loại Chuỗi

&lt;Message&gt;

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

Chỉ định tải trọng thông báo cần ký. Dữ liệu đầu vào của phần tử này hỗ trợ mẫu thông báo (thay thế biến) để cho phép đưa các mục bổ sung vào trong thời gian chạy, chẳng hạn như dấu thời gian, số chỉ dùng một lần, danh sách tiêu đề hoặc thông tin khác. Ví dụ:

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

Mẫu thông báo có thể bao gồm các phần cố định và thay đổi được, kể cả dòng mới và hàm tĩnh. Khoảng trắng rất quan trọng.

Mặc định Không áp dụng
Sự hiện diện Bắt buộc
Loại Chuỗi
Giá trị hợp lệ Mọi chuỗi đều hợp lệ đối với giá trị văn bản. Nếu bạn cung cấp thuộc tính ref, nó sẽ được ưu tiên hơn giá trị văn bản. Chính sách này đánh giá văn bản hoặc biến được tham chiếu dưới dạng mẫu thông báo.

&lt;Output&gt;

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

Chỉ định tên của biến mà chính sách phải đặt bằng giá trị HMAC đã tính toán. Đồng thời, chỉ định phương thức mã hoá để sử dụng cho đầu ra.

Mặc định

Biến đầu ra mặc định là hmac.POLICYNAME.output.

Giá trị mặc định của thuộc tính encodingbase64.

Sự hiện diện Không bắt buộc. Nếu không có phần tử này, chính sách sẽ đặt biến luồng hmac.POLICYNAME.output với một giá trị được mã hoá base64.
Loại Chuỗi
Giá trị hợp lệ

Để mã hoá, hex, base16, base64, base64url.

Các giá trị không phân biệt chữ hoa chữ thường; hexbase16 là từ đồng nghĩa.

Giá trị văn bản của phần tử Output có thể là bất kỳ tên biến luồng hợp lệ nào.

&lt;SecretKey&gt;

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

Chỉ định khoá bí mật dùng để tính toán HMAC. Khoá này lấy từ dữ liệu đã tham chiếu được giải mã theo kiểu mã hoá cụ thể.

Mặc định

Không có giá trị mặc định cho biến được tham chiếu; thuộc tính ref là bắt buộc.

Khi không có thuộc tính encoding thì chính sách này theo mặc định giải mã chuỗi khoá bí mật bằng UTF-8 để lấy các byte khoá.

Sự hiện diện Bắt buộc
Loại Chuỗi
Giá trị hợp lệ

Đối với encoding, các giá trị hợp lệ là hex, base16, base64, utf8. Giá trị mặc định là UTF8. Các giá trị không phân biệt chữ hoa chữ thường và dấu gạch ngang là không đáng kể. Base16 giống với base-16bAse16. Base16Hex là từ đồng nghĩa.

Việc sử dụng thuộc tính mã hoá cho phép bạn chỉ định khoá bao gồm các byte nằm ngoài phạm vi ký tự có thể in UTF-8. Ví dụ: giả sử cấu hình chính sách bao gồm:

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

Giả sử private.encodedsecretkey chứa chuỗi 536563726574313233.

Trong trường hợp này, các byte khoá sẽ được giải mã như sau: [53 65 63 72 65 74 31 32 33] (mỗi byte được biểu thị dưới dạng hex). Một ví dụ khác là nếu encoding='base64', và private.encodedsecretkey chứa chuỗi U2VjcmV0MTIz, thì kết quả sẽ trả về cùng một tập hợp byte cho khoá. Không có thuộc tính mã hoá, hoặc với thuộc tính mã hoá là UTF8, giá trị chuỗi Secret123 sẽ dẫn đến kết quả cùng một tập hợp byte.

&lt;VerificationValue&gt;

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

(Không bắt buộc) Chỉ định giá trị xác minh cũng như thuật toán mã hoá được dùng để mã hoá giá trị xác minh. Chính sách sẽ sử dụng thuật toán này để giải mã giá trị.

Mặc định Không có giá trị xác minh mặc định. Nếu phần tử này có mặt nhưng phần tử Thiếu thuộc tính encoding. Chính sách này sử dụng phương thức mã hoá mặc định là base64
Sự hiện diện Không bắt buộc
Loại Chuỗi
Giá trị hợp lệ

Các giá trị hợp lệ cho thuộc tính mã hoá là: hex, base16, base64, base64url. Các giá trị không phân biệt chữ hoa chữ thường; hexbase16 là từ đồng nghĩa.

Phương thức mã hoá của VerificationValue không cần phải giống như kiểu mã hoá dùng cho phần tử Output.

&lt;IgnoreUnresolvedVariables&gt;

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

Đặt thành false nếu bạn muốn chính sách gửi lỗi khi bất kỳ biến được tham chiếu nào được chỉ định không thể giải quyết được trong chính sách. Đặt thành true để coi mọi biến không thể giải quyết là một chuỗi trống (rỗng).

Giá trị boolean IgnoreUnresolvedVariables chỉ ảnh hưởng đến các biến được tham chiếu bởi tin nhắn mẫu. Mặc dù SecretKeyVerificationValue đều có thể tham chiếu đến một biến, nhưng cả hai trong số đó cần phải phân giải được, vì vậy cài đặt ignore không áp dụng cho các mục đó.

Mặc định Sai
Sự hiện diện Không bắt buộc
Loại Boolean
Giá trị hợp lệ true hoặc false

Biến luồng

Chính sách này có thể đặt các biến này trong quá trình thực thi.

Biến Mô tả Ví dụ:
hmac.policy_name.message Chính sách này đặt biến này với thông báo có hiệu lực, kết quả của việc đánh giá mẫu thông báo được chỉ định trong Message . hmac.HMAC-Policy.message = "Hello, World"
hmac.policy_name.output Lấy kết quả của phép tính HMAC, khi phần tử Output thực hiện không chỉ định tên biến. hmac.HMAC-Policy.output = /yyRjydfP+fBHTwXFgc5AZhLAg2kwCri+e35girrGw4=
hmac.policy_name.outputencoding Lấy tên của phương thức mã hoá đầu ra. hmac.HMAC-Policy.outputencoding = base64

Error reference

This section describes the fault codes and error messages that are returned and fault variables that are set by Apigee when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.

Runtime errors

These errors can occur when the policy executes.

Fault code HTTP status Occurs when
steps.hmac.UnresolvedVariable 401

This error occurs if a variable specified in the HMAC policy is either:

  • Out of scope (not available in the specific flow where the policy is being executed)

    or

  • Can't be resolved (is not defined)
steps.hmac.HmacVerificationFailed 401 The HMAC verification failed; the verification value provided does not match the calculated value.
steps.hmac.HmacCalculationFailed 401 The policy was unable to calculate the HMAC.
steps.hmac.EmptySecretKey 401 The value of the secret key variable is empty.
steps.hmac.EmptyVerificationValue 401 The variable holding the verification value is empty.

Deployment errors

These errors can occur when you deploy a proxy containing this policy.

Error name HTTP status Occurs when
steps.hmac.MissingConfigurationElement 401 This error occurs when a required element or attribute is missing.
steps.hmac.InvalidValueForElement 401 This error occurs if the value specified in the Algorithm element is not one of the following values: SHA-1, SHA-224, SHA-256, SHA-512, or MD-5.
steps.hmac.InvalidSecretInConfig 401 This error occurs if there is a text value explicitly provided for SecretKey.
steps.hmac.InvalidVariableName 401 This error occurs if the SecretKey variable does not contain the private prefix (private.).

Fault variables

These variables are set when a runtime error occurs. For more information, see What you need to know about policy errors.

Variables Where Example
fault.name="fault_name" fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. fault.name Matches "UnresolvedVariable"
hmac.policy_name.failed The policy sets this variable in the case of a failure. hmac.HMAC-Policy.failed = true

Example error response

For error handling, the best practice is to trap the errorcode part of the error response. Do not rely on the text in the faultstring, because it could change.

Example fault rule

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