2014-01-30 97 views
16

有沒有什麼方法可以將發送到我的REST API的請求僅限於來自我自己的移動應用程序二進制文件的請求?這個應用程序將分佈在谷歌播放和蘋果應用程序商店,所以它應該暗示有人將有權訪問其二進制文件,並嘗試對其進行反向工程。僅將API請求限制爲僅限我自己的移動應用程序

我在想什麼涉及應用程序簽名,因爲每個發佈的應用程序都必須以某種方式進行簽名,但我無法弄清楚如何以安全的方式進行簽名。也許是獲得應用程序簽名,再加上基於時間的散列,再加上應用程序生成的密鑰對以及雖然默默無聞的舊安全性的組合?

我在尋找儘可能不合格的東西。原因是因爲我需要根據手機傳感器收集的數據將數據傳輸到應用程序,如果人們可以將自己的應用程序構成並將數據發送給我的api,而這些數據不是由我自己的算法處理的,則它會打敗它目的。

我接受任何有效的解決方案,無論多麼複雜。錫箔帽子解決方案非常感謝。

+0

檢查我的答案。我這樣做,它很滿意;) –

回答

11

存儲在應用程序中的任何憑據都可以由用戶公開。在Android的情況下,他們可以完全反編譯你的應用程序,並輕鬆地檢索它們。

如果與服務器的連接不使用SSL,則可以輕鬆地從網絡中嗅探出它們。

說真的,任何想要憑證的人都會拿到他們,所以不要擔心隱瞞他們。本質上,你有一個公共的API。

存在一些缺陷,需要額外的時間來管理公共API。

許多公共API仍然通過IP地址進行跟蹤並實施tarpits來簡化放慢似乎濫用系統的任何IP地址的請求。這樣,來自同一IP地址的合法用戶仍然可以繼續,儘管速度較慢。

儘管您可能會與濫用者同時阻止無辜和正直的用戶,但您必須願意關閉IP地址或IP地址範圍。如果你的申請是免費的,它可以給你更多的自由,因爲沒有預期的服務水平和合同,但你可能想要保護自己的法律協議。

一般來說,如果您的服務足夠流行以至於有人想要攻擊它,那通常是一個好兆頭,所以不要太早擔心它,但要確保它在前面。你不希望你的應用失敗的原因是因爲用戶厭倦了在慢速服務器上等待。

您的其他選擇是讓用戶註冊,因此當您發現濫用情況時,您可以通過憑證而不是IP地址進行阻止。

6

不。您正在發佈帶有公共接口的服務,並且您的應用大概只能通過此REST API進行通信。您的應用可以發送的任何內容,其他任何人都可以發送。這意味着確保訪問的唯一方法是以某種方式進行身份驗證,即保密。但是,您也正在發佈您的應用程序。這意味着你的應用程序中的任何祕密也基本上被髮布出來。你不能兩面都有;你不能指望既放棄你的祕密,並保守祕密。

1

沒有什麼可以做的。因爲當你讓一些人可以打電話給你的API。你可以做的最多的是如下:

因爲你只想要你的應用程序(帶有特定的包名稱和簽名)調用你的API,你可以實際得到apk的簽名密鑰,併發送到切斷每一個API調用,如果那你確定你的請求響應。 (或者你可以有一個令牌API,你的應用程序會在應用程序的每一個開始時調用它,然後將該令牌用於其他API--儘管令牌必須在一段時間不工作後失效)

那麼你需要編程代碼,所以沒有人看到你發送的內容以及你如何加密它們。如果你做了一個好的加密反編譯將是如此難以做到。

即使apk的簽名也可以用某些困難的方式來嘲弄,但是它可以做到最好。

+4

簽名不是很難作弊,因爲它是由客戶端發送,客戶端完全控制發送的內容。 Proguard並確保只從應用程序對API進行加密(SSL/TLS)調用(除了固定證書)可以通過默默無聞提供一些體面的安全性,直到他們解密源代碼,關閉證書鎖定並執行中間人攻擊看看發送了什麼。 –

0

正如其他答案和意見所暗示的那樣,您無法真正將API訪問權限限制在您的應用中,但您可以採取不同的措施來減少嘗試次數。我相信最好的解決方案是使用像「App-Version-Key」這樣的自定義頭部向你的API(當然是本地代碼)發出請求(這個密鑰將在編譯時決定),並讓你的服務器檢查這個密鑰決定是否接受或拒絕。同樣,當使用這種方法時,你應該使用HTTPS/SSL,因爲這樣可以減少人們通過查看網絡請求來查看密鑰的風險。

關於Cordova/Phonegap應用程序,我將創建一個插件來執行上述方法。完成後我會更新此評論。

相關問題