基于 HTTP 签名的基于 REST 的 Web 服务安全性

REST based web services security based on HTTP signatures

我一直在研究如何为我们的 REST Web 服务使用正确的安全机制。我正在浏览有关 HTTP 签名的文档 -> https://datatracker.ietf.org/doc/html/draft-cavage-http-signatures-12.

根据此文档,一些 HTTP header 被选中、散列和数字签名。此签名字符串在 HTTP header 中更新。服务提供商将重新创建哈希(基于收到的 HTTP headers)并验证签名字符串以验证客户端。这也反过来证明消息没有被篡改。

某些有权访问网络的黑客是否可能仅更改 HTTP body 而未更改作为签名一部分的 header 属性。如果是,那么服务提供商收到的消息不是客户想要的消息,不是吗?那么,这种签署HTTP请求的方式是如何保证消息完整性的呢?

您可以在 header 中包含 body 的摘要(哈希)。因此,如果 body 发生变化,Digest 将发生变化并且不会与 body.

的 Digest 匹配

快速浏览您指向的规范文档: 在第10页的底部,阅读如下:

POST /foo HTTP/1.1
Host: example.org
Date: Tue, 07 Jun 2014 20:51:35 GMT
Content-Type: application/json
Digest: SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=
Content-Length: 18

{"hello": "world"}

Note that the use of the Digest header field is per RFC 3230 [RFC3230], Section 4.3.2 [12] and is included merely as a demonstration of how an implementer could include information about the body of the message in the signature.

还有一种不同的机制也可以防止篡改,适用于 headers 和 body(以及其他一切)并且已经得到广泛支持:HTTPS

Is it possible for some hacker who has access to the network to just change the HTTP body without changing the header attributes that are part of the signature.

是的。任何未被签名覆盖的内容都可以在不被发现的情况下被更改——当然,假设攻击者也能够破坏其他完整性保护机制(TLS 也提供此功能)。

If yes, then the message received by service provider is not the one intended by the client is it not?

没错。只有一处更正。消息中受完整性保护的部分不能在未检测到的情况下被更改。因此,虽然整个消息可能是伪造的,但可能有一些部分仍然完好无损并且与原始消息相符。

So, how does this way of signing the HTTP request ensure message integrity?

它只确保客户端选择签名的部分的完整性。为了确保完整消息的完整性,您还需要检查已签名的 headers,并确保它涵盖了您要处理的所有内容。

如果您想了解有关签名方案和替代方案的更多信息,请查看 post 我写的正是这个:Web API Authentication Guide, Signature Schemes.