1

我一直在读这个:http ://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/

这是一篇非常棒的文章。我想到的一个问题是这一步(在文章的后半部分):

4. (OPTIONAL) The only way to protect against “replay attacks” on your API is to include a timestamp of time kind along with the request so the server can decide if this is an “old” request, and deny it. The timestamp must be included into the HMAC generation (effectively stamping a created-on time on the hash) in addition to being checked “within acceptable bounds” on the server.
5. [SERVER] Receive all the data from the client.
6. [SERVER] (see OPTIONAL) Compare the current server’s timestamp to the timestamp the client sent. Make sure the difference between the two timestamps it within an acceptable time limit (5-15mins maybe) to hinder replay attacks.

如果必须发送时间戳,这意味着它必须在客户端和服务器的哈希中,因此必须使用相同的确切时间。现在,这意味着我必须以纯文本或加密的形式发送日期,可能作为标头值。它是否正确?因为如果它很简单,那么重放攻击者就不能轻松地将日期修改到可接受的范围内(出于验证目的)......所以我们可以加密日期,但这意味着哈希和加密数据都在起作用,而不是只是将所有数据加密在一起。

我的评估是否正确,或者有没有办法包括一个安全的日期?还是在这种情况下必须对其进行加密?

谢谢。

4

1 回答 1

6

HMAC 是消息验证码。这意味着如果您有一些消息 M,您可以使用该消息和您的密钥 K 生成 V = HMAC(M, K)。请记住,只要您将 K 保密,其他人就无法生成相同的 V除非通过尝试猜测 K。如果 K 足够大,这是不可行的。

这也意味着您在 M 中包含的所有内容都不能在不更改 V 的情况下更改,因为 M 和 K 都在 HMAC 中使用。因此,如果包含时间戳,则必须确保它包含在 HMAC 计算中。如果攻击者尝试修改时间戳,HMAC 生成的 V 将不同 -> 您可以检测到该尝试并丢弃该请求。

HMAC 为您提供“真实性”,这意味着您可以判断它是否来自知道密钥的人。加密是不同的:它为您提供“机密性”,这意味着没有人可以在不知道密钥的情况下阅读消息。重要的是要记住,加密不会给你真实性,因为攻击者可能只是改变加密消息中的一个随机位。要同时具​​有机密性和真实性,您必须使用 HMAC 以及加密。

如果您不需要保密,请不要加密您的数据,因为它会浪费 CPU 周期并使您的系统更加复杂而没有任何收获。

于 2012-06-12T14:59:34.137 回答