# 計算簽名
在計算簽名之前,從 [清博大數據開放平臺應用管理中創建應用](http://open.gsdata.cn/user)派生出簽名密鑰。由于派生簽名密鑰特定于日期、接口和APP,因此它提供了更高程度的保護。秘密訪問密鑰不只用于對請求進行簽名。然后將簽名密鑰和您在[創建待簽字符串](create-string-to-sign.md)中[創建的待簽字符串](create-string-to-sign.md)用作加密哈希函數的輸入。加密哈希函數生成的十六進制編碼結果就是簽名。
簽名需要您使用特定UTF-8字符編碼來對待簽字符串進行編碼。
**計算簽名**
1. 派生您的簽名密鑰。為此,請使用您的秘密訪問密鑰創建一系列基于哈希的消息身份驗證代碼 (HMAC)。此代碼顯示在以下偽代碼中,其中 HMAC(key, data) 表示以二進制格式返回輸出的 HMAC-SHA256 函數。每個哈希函數的結果將成為下一個函數的輸入。
用于派生簽名密鑰的偽代碼
~~~
kSecret = your secret access key
kDate = HMAC("GSDATA" + kSecret, Date)
kService = HMAC(kDate, Service)
kSigning = HMAC(kService, "gsdata_request")
~~~
請注意,哈希過程中所使用的日期的格式為 YYYYMMDD(例如,20170620),不包括時間。
確保以正確的順序為您要使用的編程語言指定 HMAC 參數。在此示例中,密鑰是第一個參數,數據 (消息) 是第二個參數,但您使用的函數可能以不同順序指定密鑰和數據。
使用摘要 (二進制格式) 來派生密鑰。大多數語言都有用來計算二進制格式哈希(通常稱為摘要)或十六進制編碼哈希(稱為十六進制摘要)的函數。派生密鑰需要使用二進制格式摘要。
有關如何在不同編程語言中派生簽名密鑰的更多信息,請參閱說明如何為 Signature 派生簽名密鑰的示例。
2. 計算簽名。要計算簽名,請使用派生的簽名密鑰和待簽字符串作為加密哈希函數的輸入。在計算簽名后,將二進制值轉換為十六進制表示形式。
以下偽代碼說明如何計算簽名。
~~~
signature = HexEncode(HMAC(derived signing key, string to sign))
~~~