Java中的安全web服务调用


Secure webservice call in Java

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

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

我正试图跟踪统计数据,如果用户获得了httprequest,他们可以进入浏览器并进入URL来混淆数字。

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

我想要一种方法,这个请求要么在浏览器中不起作用,要么在没有httprequest的情况下这样做。希望这能说得通。

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

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

现在,在所有三个中,#2是最简单的,可能对你的目的已经足够了。2号也可以与3号结合使用,以增加安全性。总之,这应该足以阻止用户从浏览器访问您的服务。

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

我想你说的是你的服务器不能信任客户端提供正确的值,除非它是你自己的程序。因此,您需要一种方法来确保调用服务的是您自己的客户机,而不是另一个恶意客户机。您担心嵌入到客户端的任何身份验证方法都可能被反向设计,恶意客户端随后可以使用相同的身份验证方法来假装是合法客户端。

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

如果有人在反编译你的java,那么一切都完了。您所能期望的最好情况是,混淆器将使阅读反编译代码变得足够困难。