2010-10-01 152 views
3

我有一个需要连接到服务器的java应用程序。它很简单,以确保服务器不被欺骗使用SSL,但我似乎无法绕过我的头如何服务器将验证客户端,以确保请求只来自可信方。只有第一个通信需要被认证。在通信步骤中,客户端和服务器将交换一些将用于随后认证客户端的信息。由服务器进行的客户端身份验证

我能想到的一种方法是对应用程序进行数字签名,然后将应用程序的数字签名发送到服务器。服务器验证数字签名以认证客户端。现在我有这方面几个问题:

  1. 是否有可能从 获得内本身 应用程序的数字签名。如果是,那么如何? (我试过寻找这对 互联网,但找不到任何 办法这样做)
  2. 是否可以用其他的方法,如 十六进制编辑器中提取此签名。如果这是已知的,则 任何人都可以将该签名 发送到服务器并欺骗客户端。

另外,请让我知道如果我是完全错误的轨道在这里:)

编辑上:通过“可信方”我的意思是“未修饰的客户端”

+0

公私钥加密可能有效。将公钥分配给受信任方。 – 2010-10-01 08:30:50

+0

@Sagar V,客户将自由分配,我无法控制它最终运行的位置。如果可以取出,则将公钥分发给客户端不是一种选择。 – Prashast 2010-10-01 08:44:55

+0

什么会阻止修改后的客户端发送未修改的客户端的数字签名? – Christoffer 2010-10-01 08:47:12

回答

4

另外,请让我知道如果我 完全在错误的轨道在这里:)

您是:)

您的目标是“确保请求只来自可信方” - 如果“可信方”被解释为“可信用户”,则这是全球数百万网站通过简单密码每天解决的标准身份验证问题认证。如果你想变得花哨(并且不方便/昂贵),你可以使用SSL client certificatesRSA tokens

但是,您似乎将“可信任方”解释为“使用未修改的客户端的可信用户”,其中“未修改”包括用户在目的上进行的修改。

好吧,忘了那个。无法完成,除非您让用户只使用由您提供的物理安全硬件。保护软件不被控制其执行环境的人员任意操纵是不可能的。电影业已花费数十亿美元,由于加密和许可要求,迫使新标准变得更加复杂和昂贵,并疏远了许多试图这样做的客户,并且失败(反复)。

编辑: 好像它甚至不是关于在所有客户端(如在保护它反对修改,通常是指反盗版措施),这显然是有关控制对服务器的访问。在这种情况下,不要浪费大脑思考客户的时间。这不是你的问题。访问服务器是。因此,开始考虑协议,如何认证客户端以及接受哪些请求。修正你的协议,以便“假装成客户端”是一个非问题,因为除了那些合法客户端可能发送的请求不会被接受。

+0

你说得对,我将“可信任方”解释为“未经修改的客户”。这种情况没有人类用户。我试图避免的是反编译应用程序,理解如何与服务器通信然后假装成客户端的逻辑。不应该代码签名能够解决这样的问题? – Prashast 2010-10-01 08:40:52

+2

@Prashast:不会,完全浪费时间。您可以通过代码混淆使其变得更加困难,但正如我所说的,保护软件免受控制其执行环境的恶意用户的影响甚至在理论上是不可能的。另请参阅编辑。 – 2010-10-01 08:51:04

+0

如果我的代码是由我的私钥签名的,我不应该能够以某种方式检查该数字签名以进行身份​​验证吗?噢,如果不能这样做,我会有很多重新思考的事情:) – Prashast 2010-10-01 09:25:49

相关问题