_GetHMAC

HTTP Requests

_GetHMAC

Top  Previous  Next

 

Hash HMAC một string

 

 _GetHMAC($sString, $iKey, $iAlgID)

 

 

 

* Tham số

$sString

Chuỗi muốn mã hoá

$iKey

Key (mật khẩu) mã hoá

$iAlgID

Thuật toán mã hoá

 

 

 

* Giá trị trả về

Chuỗi mã hoá HMAC

 

 

 

* Ghi chú

·Thường thì request Rest API do một trang web cung cấp sẽ yêu cầu Authorize với HMAC.
·Bảng giá trị của tham số $iAlgID:

Loại  Algorithm

Giá trị

$CALG_AES_128

0x0000660e

$CALG_AES_192

0x0000660f

$CALG_AES_256

0x00006610

$CALG_MD5

0x00008003

$CALG_SHA1

0x00008004

$CALG_SHA_256

0x0000800c

$CALG_SHA_384

0x0000800d

$CALG_SHA_512

0x0000800e

 

Lưu ý: Các biến hằng số $CALG_SHA_256, $CALG_SHA_384, $CALG_SHA_512 không được định nghĩa trong thư viện Crypt.au3 nên ta cần tự khai báo hoặc điền thẳng giá trị của nó vào tham số $iAlgID.

 

 

 

* Ví dụ

Ví dụ là REST API của trang adf.ly (trang nhúng quảng cáo này hẳn ai cũng biết), phần HMAC Authentication, được trang này giải thích như sau:

 

Public Key/Secret Key and HMAC authentication is designed for API endpoints which provides ability to Create / Read / Update / Delete information accessible only to account holder.

You should do following in order to access such API endpoints:

 

  1. Before making the REST API call, combine all the parameters and values you intend on sending. Append your UserId (“_user_id”), Public API Key (“_api_key”). In order to prevent replay attacks you must include a current Unix timestamp (http://en.wikipedia.org/wiki/Unix_time) using UTC time (“_timestamp”) to this parameters list. Optionally include “_page” parameter for data pagination.

 

  2. Build query string (see http://en.wikipedia.org/wiki/Query_string):

·URL encoding should be performed per RFC 1738 (http://www.faqs.org/rfcs/rfc1738.html) which implies that spaces are encoded as plus (+) signs.
·Sort the query string parameters using byte ordering, so parameter name 'param[10]' comes before 'param[2]'.

 

  3. Hash (SHA256) the URL_encoded query string from Step #2 with your Private Key assigned to you by the system.

 

  4. Append computed hash value to request parameters scope with “_hash” parameter name and send all parameters to server in format which corresponds to the type of HTTP request.

 

Parameters order does not matter.

 

Phân tích:

Khi ta đăng ký adf.ly và vào trang REST API của nó thì ta sẽ nhận được 3 thông số tài khoản: User-ID, Public-Key (API-Key) và Secret-Key (Private-Key). Ví dụ ta nhận được User-ID = 123, Public-Key = ABC và Secret-Key = XYZ.

 

1. Xây dựng tham số $sString:

o“_user_id” và “_api_key” : Đã sẵn sàng được cung cấp.
o“_timestamp” : nó giải thích là a current Unix timestamp nên ta dùng hàm _TimeStampUNIX.

$sString = '_user_id=123&_api_key=ABC&_timestamp=' & _TimeStampUNIX()

 

2. URL Encode $sString và sắp xếp lại các tham số của chuỗi $sString theo thứ tự:

$sString = _Data2SendEncode('_api_key=ABC&_timestamp=' & _TimeStampUNIX() & '_user_id=123')

 

3. Hash HMAC SHA256 với $iKey là Secret_Key.

 

#include <_HttpRequest.au3>

$sString = _Data2SendEncode('_api_key=ABC&_timestamp=' & _TimeStampUNIX() & '_user_id=123')

$HMAC = _GetHMAC($sString, 'XYZ', 0x0000800c) ; 0x0000800c là $CALG_SHA_256