2014-02-25 31 views
0

我正在构建一个连接到Web服务器并通过基于套接字的API进行通信的桌面应用程序。我想确保我只与我的应用程序通话,而不是任何第三方黑客。通信通过https进行加密。另外,私钥/公钥对用于认证。基本上,时间,私有密钥和公钥都被散列在一起,并使用当前时间和公钥发送到服务器。验证连接客户端是否正确应用

我担心如果其他人对应用程序进行逆向工程,他们会发现散列函数,连接url和私钥,因为通常字符串以明文形式存储在编译的应用程序中。

我有两个想法,以减轻这一点:

  • 创建生成利用一系列的数学运算
  • 创建一个复杂的(长)的秘密,然后采取一些模应用程序特定的私有密钥的功能将该秘密发送给服务器(如Diffie-Hellman密钥交换算法)。

我在正确的轨道上吗?我如何保密密钥?

+0

可能重复的[如何隐藏二进制代码中的字符串?](http://stackoverflow.com/questions/1356896/how-to-hide-a-string-in-binary-code) –

+0

如果客户端私钥遭到破坏,防止模仿的做法并不多。无论如何,你不应该信任客户的输入。 – imreal

回答

1

加密是不是正确的方法。无论你如何隐藏实现,具有足够时间的确定攻击者都可以对其进行反向工程。

攻击者至少可以确定加密/散列完成的位置,并在此之前转储进程的内存以检查明文中的秘密。

你最好的选择将是一个)混淆代码,并添加反调试防御(并不完美,但它会阻止脚本小子,减缓坚定的攻击)和b)硬化尽可能多的,你可以服务器端

基本上,你永远不能依赖客户端,因为你不能控制它。你最好的选择是确保任何关键处理都是在服务器端完成的,所以定制客户端不能做任何恶意的事情。例如,如果您正在制作多人国际象棋游戏,您希望客户端提交基本操作(移动),并且您将在服务器上跟踪棋盘状态。客户端是否被黑客入侵并不重要,因为如果提交了非法操作,您只需返回错误。