2014-02-25 32 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)硬化儘可能多的,你可以服務器端

基本上,你永遠不能依賴客戶端,因爲你不能控制它。你最好的選擇是確保任何關鍵處理都是在服務器端完成的,所以定製客戶端不能做任何惡意的事情。例如,如果您正在製作多人國際象棋遊戲,您希望客戶端提交基本操作(移動),並且您將在服務器上跟蹤棋盤狀態。客戶端是否被黑客入侵併不重要,因爲如果提交了非法操作,您只需返回錯誤。