使用HMAC保护REST服务

时间:2012-06-12 02:15:32

标签: .net security rest

我一直在读这个: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.

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

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

感谢。

1 个答案:

答案 0 :(得分:6)

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

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

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

如果您不需要保密,请不要对数据进行加密,因为它会浪费CPU周期并使您的系统更加复杂而不会获得任何内容。