我試圖構建一個安全的系統,用於將數據從客戶端Android應用程序傳輸到運行PHP的Web服務器。驗證該消息來自特定的應用程序/終點
我想要做的就是確保系統的加密安全性,使得來自應用程序的消息可以被驗證爲來自應用程序本身,而不是來自可能已經寫入自定義腳本或可能使用cURL來遊戲系統。
有對這種驗證的一些使用情況,例如: -
如果一個應用程序包含從中收集度量的廣告,你會想驗證點擊數據是從應用發送而不是從已經計算出您的API併發送虛擬數據的惡意用戶發送。
該應用程序可能會進行多項選擇調查,並且您需要再次確認調查結果是從應用程序收集的。
該應用正在收集GPS跟蹤,並且您希望確保數據是從應用本身發送的。
在每一種情況下,你會想,以確保消息的來源是應用程序本身,而不僅僅是誰在運行一個簡單的腳本來僞造數據的用戶。
的一些想法,我認爲: -
SSL - 非常適用於固定通道和防止篡改(其中滿足一些要求),但仍不能保證源的完整性數據。
公鑰加密 - 客戶端應用程序可以用私有密鑰對數據進行加密,然後將其傳送到可以被解碼的服務器。問題是私鑰需要在應用程序中進行硬編碼 - 應用程序可以被反編譯,並提取私鑰,然後用於發送僞造數據。
國產算法 - 一個非常類似的問題,這是問here其中僅解決工作,直到「有人計算出你的算法」 - 即沒有一個很好的解決方案!
Hash chain - 這似乎是一個很有趣的使用一次性密鑰驗證服務器從客戶機到服務器的每個數據有效載荷的方式,但它再次依靠自己沒有被反編譯的應用程序,因爲密碼仍然需要由應用程序存儲。
我的密碼學的知識有限讓我覺得它實際上是理論上不可能建立一個系統,這將是這種方式完全可驗證的,因爲如果我們不能相信最終客戶或渠道,再有就是沒有任何信任......但也許有一些我忽視了!
如何使用由服務器生成的[nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)來標識事務?使用GCM或其他方法確保只有設備可以接收現時。 –
參與GCM並不是一個壞主意,但我們假設沒有其他方式可以通過Android應用程序接收GCM消息......也許有(我不知道)。無論哪種方式,如果我們能夠想出一個不依賴於平臺特定技術的解決方案(如果存在的話)將會很好。 –
也許你想嘗試security.stackexchange.com。我不是一個加密專家,但那裏有很多。 –