【问题标题】:Writing a secure REST web service编写安全的 REST Web 服务
【发布时间】:2012-10-23 06:56:50
【问题描述】:

他们中的许多人对如何编写安全的 rest web 服务感到困惑,对于那些对使用哪种方法感到困惑的人,这篇文章会很有帮助。

编写 REST 服务的可能方式(部分安全)

  • 您意识到,实际上通过 HTTP 传递凭据会使该数据以纯文本形式被嗅探;在 Gawker 事件之后,您意识到纯文本或弱哈希值通常是一个坏主意。

  • 您意识到散列密码并通过网络发送散列代替纯文本密码仍然可以让人们至少嗅探帐户的用户名和密码的散列,这可能(例数)在彩虹表中查找。

  • 您惊呼,因为在这种情况下(实际上又是一个用户名/密码场景),您仍然会遇到与以纯文本形式发送用户名和密码相同的问题(嗅探流量)。

  • 此时您即将放弃并承认使用 OAuth,但您坚持必须有一种安全但相对简单的方法来设计公共 Web API,该 API 可以将凭据保密。

【问题讨论】:

  • 不要通过 HTTP 传递凭据。使用 HTTPS。
  • Many of them,谁?只有我错过了这个问题吗?

标签: web-services security rest hash checksum


【解决方案1】:

最佳解决方案

服务器和客户端知道公钥和私钥;只有服务器和客户端知道私钥,但每个人都可以知道公钥……谁在乎他们知道什么。 客户端创建一个唯一的 HMAC(哈希)来表示它对服务器的请求。它通过组合请求数据(参数和值或 XML/JSON 或任何它计划发送的内容)并将请求数据的 blob 与私钥一起散列来实现这一点。 然后客户端将该 HASH 连同它本来要发送的所有参数和值一起发送到服务器。 服务器获取请求并使用客户端使用的相同方法根据提交的值重新生成它自己的唯一 HMAC(哈希)。 然后服务器比较两个 HMAC,如果相等,则服务器信任客户端,并运行请求。

举例说明: (假设您从 android 发送此请求,因为 android 应用程序大多是无会话的,它们无法使用 cookie 或任何信息来记住哪个用户已登录。因此,对于这种情况,当请求连同它一起发送时,用户凭据也是必要的.)

  • 必须为其提出请求的网站(在这种情况下,我正在使用 本地主机):本地主机:8080/
  • 用户 X 的 URL REST 请求: localhost:8080/REST/books/favorites(假设响应在 用逗号分隔的纯文本 [ Harry Potter, Chandamama, 无限思绪,暮光之城])。
  • 由于必须显示用户 X 信息,请求将类似于 这: localhost:8080/REST/username/Password/books/favorites - 本地主机:8080/REST/X/abc/books/favorites

这里的问题是用户名和密码可以被嗅探,因为它们是纯文本..所以,最好在客户端加密它们并在服务器端解密它们。

现在真正的问题来了,服务器如何知道发送的请求是否是由有效的客户端发送的……

  • 解决方案是生成 URL 请求的哈希并添加 该哈希在 URL 的末尾,然后将请求发送到 服务器。 (我们一般说的是校验和)..生成校验和 使用您自己的或使用基于 java 的哈希生成器,如 SHA1、MD5 等

  • 假设为 URL 请求生成的哈希 localhost:8080/REST/encrypted-username/encrypted-Password/books/favorites 是一些哈希字符串adasfsjimnom123123k。因此,将其添加到您的网址中

localhost:8080/REST/encrypted-username/encrypted-Password/books/favorites/adasfsjimnom123123k

因此,通过这种方式,您可以保护 Web 服务请求。只有当生成的校验和有效时,服务器才会提供请求的详细信息。

使用 Curl 工具作为休息客户端(而不是单独的 Java 代码)来测试您的服务。

For Full Reference

【讨论】:

  • 您的服务器可以验证哈希是否正确,因为它具有您的客户端用来生成哈希的私钥。你是如何在客户端和服务器之间交换私钥的?
  • 这个解决方案听起来不错。但是在解释中并不清楚公钥与私钥。似乎两者都使用相同的密钥。在某些情况下,这应该不是问题。
猜你喜欢
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2011-09-18
  • 2010-09-14
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多