2012-12-18 87 views
4

我試圖構建一個安全的系統,用於將數據從客戶端Android應用程序傳輸到運行PHP的Web服務器。驗證該消息來自特定的應用程序/終點

我想要做的就是確保系統的加密安全性,使得來自應用程序的消息可以被驗證爲來自應用程序本身,而不是來自可能已經寫入自定義腳本或可能使用cURL來遊戲系統。

有對這種驗證的一些使用情況,例如: -

  • 如果一個應用程序包含從中收集度量的廣告,你會想驗證點擊數據是從應用發送而不是從已經計算出您的API併發送虛擬數據的惡意用戶發送。

  • 該應用程序可能會進行多項選擇調查,並且您需要再次確認調查結果是從應用程序收集的。

  • 該應用正在收集GPS跟蹤,並且您希望確保數據是從應用本身發送的。

在每一種情況下,你會想,以確保消息的來源是應用程序本身,而不僅僅是誰在運行一個簡單的腳本來僞造數據的用戶。

的一些想法,我認爲: -

  • SSL - 非常適用於固定通道和防止篡改(其中滿足一些要求),但仍不能保證源的完整性數據。

  • 公鑰加密 - 客戶端應用程序可以用私有密鑰對數據進行加密,然後將其傳送到可以被解碼的服務器。問題是私鑰需要在應用程序中進行硬編碼 - 應用程序可以被反編譯,並提取私鑰,然後用於發送僞造數據。

  • 國產算法 - 一個非常類似的問題,這是問here其中僅解決工作,直到「有人計算出你的算法」 - 即沒有一個很好的解決方案!

  • Hash chain - 這似乎是一個很有趣的使用一次性密鑰驗證服務器從客戶機到服務器的每個數據有效載荷的方式,但它再次依靠自己沒有被反編譯的應用程序,因爲密碼仍然需要由應用程序存儲。

我的密碼學的知識有限讓我覺得它實際上是理論上不可能建立一個系統,這將是這種方式完全可驗證的,因爲如果我們不能相信最終客戶或渠道,再有就是沒有任何信任......但也許有一些我忽視了!

+0

如何使用由服務器生成的[nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)來標識事務?使用GCM或其他方法確保只有設備可以接收現時。 –

+0

參與GCM並不是一個壞主意,但我們假設沒有其他方式可以通過Android應用程序接收GCM消息......也許有(我不知道)。無論哪種方式,如果我們能夠想出一個不依賴於平臺特定技術的解決方案(如果存在的話)將會很好。 –

+2

也許你想嘗試security.stackexchange.com。我不是一個加密專家,但那裏有很多。 –

回答

0

這並不難,你只需要驗證應用程序。您可以使用簡單的用戶名和密碼(通過SSL)或使用客戶端身份驗證來完成此操作。在這兩種情況下,證書都需要在應用程序中,攻擊者可以提取它們並模擬應用程序。你必須離開它,也許實施一些方法來緩解它。

您還可以通過使用非對稱密鑰(RSA等)或對稱密鑰(HMAC等)簽名來驗證消息。隨機數有助於防止重放,即某人捕獲有效簽名的消息並將其重複發送到服務器。根據你的協議,使用一個的開銷可能太大。

爲了保護憑據,您可以讓客戶端生成它們並將它們保存在系統KeyStore中,儘管它沒有得到公共API的支持,有關詳細信息,請參閱here。當然,這需要額外的一步,您需要將生成的憑據(比如公鑰)安全地發送到服務器,這對於正確實施可能會很棘手。

不管你做什麼,都不要試圖發明自己的加密算法或協議,而要使用已建立的加密算法或協議。

+0

我認爲OP希望阻止*擁有合法證書的用戶將他們與第三方客戶端應用程序結合使用,這些應用程序並不完全相同。 – finnw

+0

它不會以這種方式閱讀,但無論如何。爲什麼人們總是關閉完全有效的問題?因爲他們可能很難回答?真? –

+0

1. OP提到在應用程序中對關鍵字進行硬編碼,因此即使他們實施了您的建議,他們仍然需要添加DRM才能使關鍵字難以提取。 2.不知道這個問題是否針對我(我沒有投票結束,因爲代言人可能是合理的。) – finnw