ChatGPT解决这个技术问题 Extra ChatGPT

如何保护 RESTful Web 服务?

我必须实施安全 RESTful web services。我已经用谷歌做了一些研究,但我被困住了。

选项:

TLS (HTTPS) +

HTTP 基础 (pc1oad1etter)

HTTP 文摘

两足 OAuth

基于 Cookie 的方法

客户证书(Tom Ritter 和这里)

使用 HMAC 签名的请求和有限的生命周期

是否有更多可能的选择需要考虑?如果是 OAuth,那么什么版本?这还重要吗?从我目前所读到的带有不记名令牌(即没有签名)的 OAuth 2.0 似乎是 insecure

我在 REST based authentication 上发现了另一篇非常有趣的文章。

Secure Your REST API... The Right Way


L
Lawrence Dol

还有另一种非常安全的方法。这是客户端证书。当您在 https 上联系服务器时,知道服务器如何呈现 SSL 证书吗?好吧,服务器可以向客户端请求证书,这样他们就知道客户端就是他们所说的那个人。客户生成证书并通过安全通道将其提供给您(例如使用 USB 密钥进入您的办公室 - 最好是非木马 USB 密钥)。

您将证书客户端证书的公钥(以及他们的签名者证书,如有必要)加载到您的 Web 服务器中,并且 Web 服务器不会接受来自任何人的连接,除了拥有证书相应私钥的人它知道。它在 HTTPS 层上运行,因此您甚至可以完全跳过 OAuth 之类的应用程序级身份验证(取决于您的要求)。您可以抽象出一层并创建本地证书颁发机构并签署来自客户端的证书请求,从而允许您跳过“让他们进入办公室”和“将证书加载到服务器上”步骤。

脖子疼?绝对地。对一切都有好处吗?没有。非常安全?是的。

然而,它确实依赖于客户保持他们的证书安全(他们不能在线发布他们的私钥),并且通常在您向客户出售服务而不是让任何人注册和连接时使用它。

无论如何,它可能不是您正在寻找的解决方案(它可能不是诚实的),但它是另一种选择。


好的,现在我很困惑哪个更好,这种方法还是another answer。你能详细说明一下吗? :D
你的答案对大师来说是完美的,但对新手来说却很困惑。您能否提供一些详细信息或链接以供阅读?
如果证书是自签名的,它仍然“非常安全”吗?
@Joyce 我认为不会。由于您不受信任(没有冒犯),因此您签署的证书(使用您自己的证书)不能被信任。我相信自签名证书对测试更有用。
鉴于最终用户(客户)有一个客户端证书,其公钥与服务器共享,如果客户的机器被黑客攻击并且他们的客户端证书被盗,整个“非常安全”的事情不会崩溃吗?
p
pc1oad1etter

HTTP Basic + HTTPS 是一种常用方法。


如果它们都通过https,我认为http摘要不会给你任何超过http basic的东西。
欢迎您认真地添加有关 HTTP 摘要的好处的有用信息。
d
dthorpe

如果在 OAuth 版本之间进行选择,请使用 OAuth 2.0。

OAuth 不记名令牌只能与安全传输一起使用。

OAuth 不记名令牌仅与加密对话的传输一样安全或不安全。 HTTPS 负责防止重放攻击,因此不记名令牌也没有必要防止重放。

确实,如果有人拦截了您的不记名令牌,他们可以在调用 API 时冒充您,但有很多方法可以降低这种风险。如果你给你的令牌一个很长的有效期,并希望你的客户在本地存储令牌,那么你有更大的令牌被拦截和滥用的风险,而不是你给你的令牌一个短暂的有效期,要求客户在每个会话中获取新的令牌,并建议客户不要保留令牌。

如果您需要保护通过多个参与者的有效负载,那么您需要的不仅仅是 HTTPS/SSL,因为 HTTPS/SSL 只加密图表的一个链接。这不是 OAuth 的错误。

不记名令牌易于客户端获取,易于客户端用于 API 调用,并且广泛用于(通过 HTTPS)保护来自 Google、Facebook 和许多其他服务的面向公众的 API。