首先,不要做HASH(DATA + KEY)
。有已知的漏洞。這正是HMAC
的設計目的。所以,你的哈希值是:
hash = HMAC(sha256, data, privateKey)
現在,處理你的問題(如何防止重放攻擊)的典型方式是通過添加一個隨機因素對每個請求。有幾種方法可以做到這一點,但運行良好的方法是基於nonce
的方法。因此:
nonce = random(16)
now = time()
data = api_data + '|' + nonce + '|' + now
hash = HMAC(sha256, data, privateKey)
apiCall = data '&nonce=' + nonce + '&time=' + now + '&sig=' + hash
然後,在接收端,您將跟蹤過去30秒內出現的隨機數列表。如果你得到一個你見過的,然後拒絕API調用(因爲這將是一個重播攻擊)。如果您獲得的時間超過30秒,請拒絕api呼叫。
if (now < time() - 30) {
return false;
} else if (nonceExists(nonce)) {
return false;
}
addNonce(nonce);
data = api_data + '|' + nonce + '|' + now
myhash = HMAC(sha256, data, privateKey)
if (myhash == hash) {
return api_data;
}
return false;
然後你就可以清除在現時的每30秒(在cron作業)或每週數據庫,其實並不重要。取決於你的API的活躍程度。
這裏的關鍵是,雖然要保持現時的軌道,而它們是有效的,否則你會很容易受到重放攻擊...
真棒。謝謝,這正是我正在尋找的。乾杯。 – jraede