Chính sách về HMAC

Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào tài liệu 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). Đôi khi được gọi là Mã xác thực tin nhắn có khoá hoặc hàm băm có khoá, HMAC sử dụng một 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 "tin nhắn", cùng với một khoá bí mật, để tạo ra một chữ ký hoặc mã xác thực tin nhắn trên tin nhắn đó. Thuật ngữ "thông báo" ở đây đề cập đến mọi luồng byte. Người gửi tin nhắn cũng có thể gửi HMAC cho người nhận và người nhận có thể dùng HMAC để xác thực tin nhắn.

Để tìm hiểu thêm về HMAC, hãy xem HMAC: Keyed-Hashing for Message Authentication (rfc2104) (HMAC: Băm khoá để xác thực thông báo (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ý đó tuân theo quy trình hoàn toàn giống nhau. Chính sách HMAC tính toán một HMAC và có thể tuỳ ý xác minh chữ ký đã tính toán dựa trên giá trị dự kiến. Phần tử VerificationValue không bắt buộc (nếu có) hướng dẫn chính sách kiểm tra giá trị đã tính toán dựa trên một giá trị đã biết hoặc được cho trước.


Tài liệu tham khảo về phần tử cho HMAC

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

Các thuộc tính á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 là thuộc tính chung của tất cả các phần tử chính 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ể dùng các ký tự sau trong tên: A-Z0-9._\-$ %. Tuy nhiên, giao diện người dùng Apigee sẽ áp dụng các quy tắc hạn chế bổ sung, 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> để 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 khác theo ngôn ngữ tự nhiên.

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

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

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

Đặ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 vẫn được đính kèm vào một luồng.

true 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

<Algorithm>

<Algorithm>algorithm-name</Algorithm>

Chỉ định thuật toán hàm băm để tính toán 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, 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 là tương đương.

<DisplayName>

<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 Apigee UI bằng một tên khác bằng ngôn ngữ tự nhiên.

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

<Message>

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

Chỉ định tải trọng thông báo cần ký. Đầ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 thêm các mục vào 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, bao gồm cả dòng mới và các hàm tĩnh. Khoảng trắng là một yếu 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ệ cho giá trị văn bản. Nếu bạn cung cấp thuộc tính ref, thì thuộc tính này sẽ được ưu tiên hơn giá trị văn bản. Chính sách này đánh giá giá trị văn bản hoặc biến được tham chiếu dưới dạng mẫu thông báo.

<Output>

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

Chỉ định tên của biến mà chính sách sẽ đặt bằng giá trị HMAC đã tính. Cũng 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 phần tử này không có, chính sách sẽ đặt biến luồng hmac.POLICYNAME.output, với giá trị được mã hoá base64.
Loại Chuỗi
Giá trị hợp lệ

Đối với việc 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à tên biến luồng hợp lệ bất kỳ.

<SecretKey>

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

Chỉ định khoá bí mật dùng để tính toán HMAC. Khoá được lấy từ biến được tham chiếu, được giải mã theo phương thức 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.

Nếu không có thuộc tính encoding, theo mặc định, chính sách sẽ 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 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 một 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 nội dung sau:

 <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ã thành: [53 65 63 72 65 74 31 32 33] (mỗi byte được biểu thị bằng số thập lục phân). Một ví dụ khác: nếu encoding='base64'private.encodedsecretkey chứa chuỗi U2VjcmV0MTIz, thì khoá sẽ có cùng một tập hợp byte. Nếu không có thuộc tính mã hoá hoặc có thuộc tính mã hoá là UTF8, giá trị chuỗi Secret123 sẽ dẫn đến cùng một tập hợp byte.

<VerificationValue>

<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á đã 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 xuất hiện nhưng thuộc tính encoding không xuất hiện, thì chính sách sẽ sử dụng chế độ 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 với phương thức mã hoá được dùng cho phần tử Output.

<IgnoreUnresolvedVariables>

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

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

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

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 dòng

Chính sách 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 bằng 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 phần tử Message. hmac.HMAC-Policy.message = "Hello, World"
hmac.policy_name.output Nhận kết quả của phép tính HMAC, khi phần tử Output 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

Tham chiếu lỗi

Phần này mô tả các mã lỗi và thông báo lỗi được trả về cũng như các biến lỗi mà Apigee đặt ra khi chính sách này kích hoạt lỗi. Thông tin này đóng vai trò quan trọng trong việc phát triển các quy tắc lỗi để xử lý lỗi. Để tìm hiểu thêm, hãy xem Những điều bạn cần biết về lỗi chính sáchXử lý lỗi.

Lỗi thời gian chạy

Những lỗi này có thể xảy ra khi thực thi chính sách.

Mã lỗi Trạng thái HTTP Xảy ra khi
steps.hmac.UnresolvedVariable 401

Lỗi này xảy ra nếu biến được chỉ định trong chính sách HMAC:

  • Ngoài phạm vi (không có trong quy trình cụ thể đang thực thi chính sách)

    hoặc

  • Không thể phân giải (không xác định)
steps.hmac.HmacVerificationFailed 401 Xác minh HMAC không thành công; giá trị xác minh được cung cấp không khớp với giá trị được tính toán.
steps.hmac.HmacCalculationFailed 401 Chính sách này không thể tính HMAC.
steps.hmac.EmptySecretKey 401 Giá trị của biến khoá bí mật đang trống.
steps.hmac.EmptyVerificationValue 401 Biến chứa giá trị xác minh đang trống.

Lỗi triển khai

Những lỗi này có thể xảy ra khi bạn triển khai proxy chứa chính sách này.

Tên lỗi Trạng thái HTTP Xảy ra khi
steps.hmac.MissingConfigurationElement 401 Lỗi này xảy ra khi thiếu một phần tử hoặc thuộc tính bắt buộc.
steps.hmac.InvalidValueForElement 401 Lỗi này xảy ra nếu giá trị được chỉ định trong phần tử Thuật toán không phải là một trong các giá trị sau: SHA-1, SHA-224, SHA-256, SHA-512 hoặc MD-5.
steps.hmac.InvalidSecretInConfig 401 Lỗi này xảy ra nếu có một giá trị văn bản được cung cấp rõ ràng cho SecretKey.
steps.hmac.InvalidVariableName 401 Lỗi này xảy ra nếu biến SecretKey không chứa tiền tố private (private.).

Biến lỗi

Các biến này được đặt khi xảy ra lỗi thời gian chạy. Để biết thêm thông tin, hãy xem Những điều bạn cần biết về lỗi chính sách.

Biến Trong đó Ví dụ:
fault.name="fault_name" fault_name là tên lỗi, như đã nêu trong Bảng Lỗi thời gian chạy ở trên. Tên lỗi là tên cuối cùng của mã lỗi. fault.name Matches "UnresolvedVariable"
hmac.policy_name.failed Chính sách này sẽ đặt biến này trong trường hợp không thành công. hmac.HMAC-Policy.failed = true

Ví dụ về phản hồi khi gặp lỗi

Để xử lý lỗi, phương pháp hay nhất là bẫy phần errorcode của lỗi của bạn. Đừng dựa vào văn bản trong faultstring vì văn bản này có thể thay đổi.

Ví dụ về quy tắc lỗi

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