2012-10-29 47 views
2

我有一個項目,我的服務器需要將超級密鑰加密密鑰發送給android應用程序。應用程序使用該密鑰進行對稱加密,以與經批准的官方藍牙設備進行通信。關鍵是沒有發現這個密鑰,因爲它可以讓任何人在應用程序外與藍牙設備進行通信。防止服務器與非官方Android客戶端進行通信

我的問題是,我怎樣才能保護這個祕密密鑰不被發現。我知道我可以使用SSL在服務器和Android應用程序之間進行通信,並且我可以確保密鑰從未實際存儲在Android設備上。

但是,我可以使用什麼技術來確保它是我未編輯的android應用程序與服務器通信,而不是另一個僞裝成我自己的應用程序,試圖獲得密鑰?

回答

1

但是,我可以使用什麼技術來確保它是我未編輯的android應用程序與服務器通信,而不是另一個僞裝成我自己的應用程序,試圖獲得密鑰?

根據定義,這是不可能的。

把你的應用程序。在某些字符串中將大寫字母A更改爲小寫字母a。運行修改後的應用。這是「另一個僞裝成你自己的應用程序」,它完全能夠與你的服務器通話。任何其他「僞裝成你自己的應用程序」僅僅比一個字母的情況有更多的變化。

因此,你有兩個主要選擇:

  1. 使用混淆技術,無論是自動(ProGuard的)和手動,要儘量隱藏與服務器的通信,然後希望沒有人癢癢撓仍然試圖對其進行逆向工程。您可以查看人們用於保護其應用程序許可代碼(例如LVL)的具體技術的方法。更高級的混淆器,如DexGuard可能會有所幫助。然而,從技術上講,有人仍然可以對應用程序進行逆向工程 - 您正在做的是讓它變得更難。

  2. 拿出一個商業模式,你不關心什麼應用程序與藍牙設備進行交互。

+0

謝謝。我提出了一種技術,使用在服務器和藍牙設備上使用通用僞隨機數算法創建的單次使用會話密鑰作爲種子,從而消除了向Android應用發送「主」密鑰的需要。我會一直假設我們的應用程序可以被反編譯,永遠不會相信它。 – dgel

0

我不相信你可以做到這一點,沒有自定義版本的Android。我的推理是,爲了確定調用應用程序是否是真的,它必須發送一些東西到服務器,SSL或不。這些東西必須從應用程序中派生出來,無論它是什麼(包名,IME等),它都可能被欺騙。

你能做的最好的是加密的東西,混淆做加密所需的關鍵,但那時,你都成逆向工程與讓你的關鍵的獎勵費用。

即使這樣的代價是值得的,有人會花費大量的努力來破解您的安全並獲得有關藍牙設備的知識和接近度的機會是多少?

相關問題