繁体   English   中英

Java 中的安全 Web 服务调用

[英]Secure webservice call in Java

我在 apache PHP 服务器上创建了一个 Web 服务,我希望能够在 java 中调用该 Web 服务而不使用 httprequest。

我最初的想法是使用查询字符串来传递 API 键来更新数据库记录。 但是,我敲了敲头,意识到用户可以反编译我的代码并查看请求并在任何浏览器中使用它。 有没有一种安全的方法来做到这一点?

我正在尝试跟踪统计信息,如果用户掌握了 httprequest,他们可以将 go 放入浏览器并转到 URL 来弄乱这些数字。

请求只是查询字符串。 像 www.example.com?apikey=aausy7556ze&stat1=this&stat2=that

我想要一种方法,这个请求要么在浏览器中不起作用,要么在没有 httprequest 的情况下以某种方式做到这一点。 希望这是有道理的。

让我们探索一些不一定涉及混淆代码的选项(尽管这样做总是有帮助的):

  1. 如果您不想使用 HTTP,您必须定义自己的协议并使用直接套接字通信。 这将确保没有人可以通过 http 访问您的服务。 然而,这种方法是一种痛苦的方法,特别是如果您已经内置了大量的 Web 服务。
  2. 如果两台服务器(PHP 和 Java)在同一个内部网络上,您可以限制 WebServices 只接受来自内部 IP 地址的请求。 这样一来,外面的任何人都无法通过 go 访问他们的浏览器并尝试通过浏览器访问您的 web 服务。
  3. 另一种方法是通过安全的 http 使用客户端证书。 您要做的是在 Java 服务器上安装客户端证书(确保无法从 Internet 下载此证书)并将 Web 服务设置为仅接受通过 https + 客户端证书验证的请求。 然后,您将使用此客户端证书调用服务,并且在 Web 服务上只接受使用有效证书的调用。 对于设置,您可以在http://www.modssl.org/docs/2.8/ssl_howto.html#ToC9查看说明(注意:我自己没有完成设置,但已经看到它有效。)。 由于服务器需要只有 Java 客户端具有的客户端证书,因此没有其他人可以调用您的 Web 服务。 请参阅此 stackoverflow 问题Java 客户端证书通过 HTTPS/SSL设置您的 Java 以调用 PHP 网络服务

现在,在所有三个中,#2 是最简单的,并且可能足以满足您的目的。 2 号也可以与 #3 组合以增加安全性。 这足以阻止用户从浏览器访问您的服务。

你到底想隐藏什么? 我想我明白你只是想确保流量是加密的。 如果你在写客户端和服务你不需要使用SSL,实际上这样做是浪费。 只需保留服务器和客户端都知道的密钥,然后使用对称算法(例如 AES)加密消息。 您还可以在加密之前向纯文本添加一些检查,以确保它没有被篡改(例如添加时间戳、消息 hash 等)

我认为您的意思是您的服务器不能信任客户端提供正确的值,除非它是您自己的程序。 因此,您需要一种方法来确保调用服务的是您自己的客户端,而不是另一个恶意客户端。 您担心您嵌入客户端的任何身份验证方法都可能被逆向工程,然后恶意客户端可以使用相同的身份验证方法伪装成合法客户端。

我认为你所能做的就是隐瞒一些事情(就像你试图通过隐藏 URL 参数来做的那样),但这个问题没有真正的解决方案。 所有常用的安全解决方案都假定身份验证凭据不会落入恶意用户的手中。 但是在您的情况下,您不能信任客户端来保证身份验证凭据的安全。

如果有人在反编译你的 java,那么所有的赌注都没有了。 您所希望的最好的结果是混淆器会使阅读您的反编译代码变得足够困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM