如何在JavaEE6中保护RESTWeb服务

如何在JavaEE6中保护RESTWeb服务,java,web-services,jakarta-ee,rest,Java,Web Services,Jakarta Ee,Rest,我已经使用JavaEE6(使用参考实现)创建了一个web应用程序,并希望将其作为RESTWeb服务公开 背景是,我希望能够将数据从web应用程序检索到我制作的iOS应用程序。问题是如何保护应用程序?我只希望我的应用程序使用web服务。这可能吗?我该怎么做?我只需要知道我应该搜索和阅读什么,而不是实际的代码 取决于您想让它变得多么安全 如果你真的不在乎,只需在你的应用程序中嵌入一个秘密单词,并包含在所有请求中 如果您更关心,请执行上述操作,并仅通过https公开服务 如果您希望它是安全的,请向您

我已经使用JavaEE6(使用参考实现)创建了一个web应用程序,并希望将其作为RESTWeb服务公开


背景是,我希望能够将数据从web应用程序检索到我制作的iOS应用程序。问题是如何保护应用程序?我只希望我的应用程序使用web服务。这可能吗?我该怎么做?我只需要知道我应该搜索和阅读什么,而不是实际的代码

取决于您想让它变得多么安全

  • 如果你真的不在乎,只需在你的应用程序中嵌入一个秘密单词,并包含在所有请求中
  • 如果您更关心,请执行上述操作,并仅通过https公开服务
  • 如果您希望它是安全的,请向您的应用程序颁发客户端证书并要求 访问服务时要存在的有效客户端证书

在承载Web服务的计算机上创建一条规则,只允许应用程序通过某个端口访问它。在Amazon EC2中,这是通过在实例安全组中创建规则来完成的。

我的建议是:

  • 使用https而不是http。有可用的免费ssl证书, 获取一个并安装
  • 使用复杂路径(如4324234AA_fdfsaf/)作为根端点

  • 由于http协议的性质,https请求中的路径部分是加密的。因此它是非常安全的。有多种方法可以通过中间人攻击解密请求,但它需要完全控制客户端设备,包括安装ilegal ssl证书。但是,我会花更多的时间在我的应用程序上,以使其成功。

    不幸的是,您的Web服务永远不会完全安全,但以下是一些您可以做的基本事情:

    • 使用SSL
    • POST
      请求中包装所有(应用程序)出站有效负载。这将防止随意窥探您的Web服务的工作方式(以便对协议进行反向工程)
    • 以某种方式验证应用程序的用户。理想情况下,这将涉及OAUTH,例如使用Google凭据,但您已经明白了
    现在我要指出为什么这不会是完全安全的:

    • 如果有人得到了你的应用程序并对其进行了反向工程,那么你所做的一切都将消失。唯一有效的方法是用户验证
    • 嵌入客户机证书(正如其他人所指出的)在这种情况下对您毫无帮助。如果我只是反向工程你的应用程序,我也有你的客户端证书
    你能做什么?

    • 验证后端上的帐户并监视其异常使用情况
    当然,当有人出现,对你的应用程序进行反向工程,构建另一个应用程序来模仿它时,这些都会消失,而你(通常)不会知道更多。这些都是需要记住的要点

    编辑:此外,如果还不明显,请使用
    POST
    (或
    GET
    )请求所有应用程序查询(到您的服务器)。这一点,再加上SSL,应该可以阻止你们随意的窥探者


    Edit2:似乎我错了,因为
    POST
    GET
    更安全。这个答案很有助于指出这一点。因此,我想您可以在这里互换使用
    GET
    POST

    我们使用RestEasy作为保护公开的RESTful Web服务的一部分。应该有很多例子,但这里有一个可能让你开始

    您还可以使用OAUTH:


    究竟为什么会有人投票关闭此应用程序?我明白了,我不需要让它作为一家银行变得安全:)我只想至少限制或阻止人们使用API的最可怕的方式。@Pjotr那么是的,SSL和将所有有效负载包装在
    POST
    请求中应该满足您的需要。我只是想指出它可能出错的地方。如何使POST比GET更安全?我明白了,谢谢:)为了确保我正确理解您的意思,您告诉我使用POST方法从我的应用程序发送所有数据,对吗?(这就是您所说的有效负载?)使用SSL时,不需要包装所有信息输入POST请求。SSL加密整个请求体,包括路径和查询字符串。我只需要一些基本的安全性:)所以你说的是,我可以从iOS应用程序发送一个参数:“MyMagicKey”:“MagicNumber030349”,并检查它在我的web应用程序中是否匹配?是的。当然,这只提供了非常基本的安全级别,因为窥探这些请求非常简单。如果你使用https,那么要想弄清楚它就要困难得多(但仍然很有可能,只是需要高于平均水平的技能)。在https中,整个请求都是加密的,而不仅仅是url。嗯。。。显然是的,您连接到的地址未加密。如果最终用户二进制文件不受检查(是吗?)。如果不是,那么从该端提取路径可能比尝试解密tls更容易。复杂的路径只需要被破坏一次,他就又回到了不安全的协议中。@ccoakley说得对。然而,我的意思是,不要使用比tls更容易猜测的url,也不要从iphone中提取二进制文件。