2014-12-22 33 views
2

我需要保護服務器API免受來自任何客戶端的使用,除了我創建的應用程序。將移動應用程序限制爲授權使用服務器的唯一客戶端API

沒有「用戶」,所以我認爲我可以使用SSL與硬編碼登錄/傳遞。

經過快速調查,我發現硬編碼,即使加密登錄&傳入應用程序是一個壞主意 - 總是有一種入侵者分析反編譯的代碼,並找到實際的登錄和傳遞,甚至從加密的存儲。

然後我開始在認證方向挖掘證書。事實證明,現在使用證書的標準SSL認證並不安全,並且最好使用SSL釘住技術。

SSL固定意味着將服務器證書的副本附加到應用程序包中,以確保證書驗證步驟安全。

但我不明白SSL固定是否可以以相反的方式實現,即將客戶端的證書存儲在服務器上,並在服務器端執行證書檢查以確保連接客戶端是我的應用。它看起來像附加到應用程序的證書也可以提取並用於外部驗證其他客戶端。

回答

1

如果你想要高水平的安全性,那麼你所要求的是不可能的。也就是說,如果您擁有的唯一「身份驗證」是下載免費應用程序的人,那麼您根本沒有任何「身份驗證」。

您的應用程序和服務器之間的整個HTTP(s)對話可以很容易地查看和重新播放。因此,您在應用上放置的任何加密憑證都可以進行反向設計。

你已經提到了一些簡單但完全不安全的技巧,它會阻止非惡意用戶並使逆向工程變得更加困難。這些包括將密碼或證書存儲在不太明顯的位置,並結合SSL。有時候這很好 - 但聽起來你已經排除了這些。

如果您查看在PC上運行的傳統許可軟件(如Microsoft Office),則它們始終會有一些許可密鑰或用戶輸入的其他信息。也許你可以爲這個應用程序提供你自己的「許可證密鑰」?

如果你真的想要保護你的應用程序免受惡意客戶的攻擊,你需要用戶或者一些外部密鑰。

如果您確實有用戶,最好的辦法是隻在應用程序中存儲會話令牌。 (通常使用共享首選項。)使用非現場Oauth API(如Facebook,Twitter(或您自己的服務))執行身份驗證並獲取令牌。 Oauth服務通常爲每個應用程序提供一個標識符。例如,Facebook使用一個「應用程序ID」,可以用來消除應用程序之間的歧義並驗證令牌。在API或服務方面,您需要使用Facebook的API驗證令牌。這需要來自該服務的額外API調用。

3

爲了防止第三方訪問您的服務,您需要告訴自己的客戶端應用程序和第三方。

無論什麼樣的差異化 - 應用程序ID,祕密,證書(這只是這種情況下的一種祕密形式) - 您構建到您的客戶端應用程序中,它必須仍然在其內部並沒有可靠的方法來防止逆向工程。這只是一個動機/資源問題。

如果使用TLS與服務進行通信,則可以在應用程序代碼中嵌入一些隨機祕密。如果沒有TLS,您應該更好地嵌入加密密鑰(對稱或不對稱)並對您的數據進行加密或簽名,以便在通信通道中至少不會泄露您的祕密。

+0

謝謝你的回答。由於無法保護應用程序免於逆向工程,因此我需要儘可能地爲入侵者完成任務。以純文本形式存儲的密碼或添加到該包的證書太容易從應用程序中獲取。你會如何推薦存儲/計算祕密,以便很難形成應用程序? – NAlexN

+1

難道你會高估他人訪問你的服務的動機嗎?如果這真的很重要,也許你的安全觀是錯誤的?如果確實沒有其他選擇,請準備好玩貓鼠遊戲:立即改變您的保護,以免第三方應用程序在沒有通知的情況下中斷。 –

+0

我正在從事的服務並不需要嚴格的安全 - 這只是我自己希望瞭解如何執行保護的權利。 – NAlexN

0

由於沒有「用戶」,因此無法區分普通用戶和惡意用戶。

但是,您可以爲應用程序執行一些基本DRM,以防止提取證書。 iOS和Android都在其文件系統上有安全分區,您可以在其中存儲更難以通過逆向工程提取的憑據。但是,這種保護不是100%,但可能會減緩潛在的攻擊者一點。這通常是手機遊戲正在做的事情。

如何在您的移動應用程序中存儲機密還有另一個問題,具體取決於所用平臺,系統版本號等。

E.g. https://stackoverflow.com/a/786588/315168

相關問題