首先,不要做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