2011-10-07 45 views
2

我想爲我的網站開發一個Android應用程序。一種做法是爲網站提供一個API,讓應用程序使用該API。不過,我希望這個API被我的android應用程序使用ONLY,我不希望任何其他客戶端使用此API。僅適用於我的Android客戶端的網站API

有沒有辦法確保這一點?

我可以想到一種做法:在應用程序中放入一個祕密,讓應用程序永遠將這個祕密傳遞給API。但我不確定這種方法有多安全,因爲任何數據包嗅探器都可以輕鬆地嗅探參數,從而獲得祕密。還有其他建議嗎?

回答

2

終於從android開發人員的博客article得到了答案。

1

簡短的回答是否,對不起。如果有人真的想利用你的網站/ api/device/program/在這裏插入任何東西,他們有時間和資源,然後他們會。

要直接回答您的問題,在您的應用中放置密鑰並不安全,因爲任何人都可以反編譯應用並嘗試從源文件重新構建密鑰,因此無需嗅探流量。

+0

我對這種感興趣。我對Java不夠了解,但是你真的可以反編譯並在解密和編譯後解壓縮它嗎?我很想看到一些帶有示例的博客文章。 –

+0

我不知道有多大的應用程序可以解決這個問題 – Bajji

+0

@MatthewRudy它可以非常容易地反編譯java類文件。像proguard這樣的混淆工具簡單地重命名類和變量,使得代碼很難解釋,但並非不可能。字符串文字最終也是人類可讀的,所以它通常很容易通過代碼尋找可能看起來是API密鑰的代碼。 – slayton

4

我認爲這與我前幾天回答的問題類似。 Securing a REST API from Android

即,找到一種方法來使用共享密鑰來驗證您的所有請求。

如果您用祕密簽署路徑和參數,那麼應該沒有辦法讓某人僞造請求。

1

糾正我,如果我錯了!數據包嗅探器只能用於未加密的WiFi和(現在)罕見的網絡配置(路由器或交換機阻止它們)。

對於嚴重問題,您應該考慮安全連接(https)。

也就是說,對於標準內容,我覺得密碼足夠安全。許多流行的網絡應用程序不會使用超過http的cookie來讓您登錄,這正是您提出的建議。

+0

數據包嗅探器可以截取網絡上的任何數據包加密或不加密,無論是否加密。加密只會改變數據包中數據的存儲方式。您實際上在此引用兩種不同類型的加密。加密的wifi意味着你和路由器之間的數據包被加密。 https表示您和網站之間的數據已加密。兩者都是半安全的,都被證明是易碎的。最後,沒有一種完美的加密算法。 – slayton

0

我努力解決這個問題,實際上我最終實施了一個版本OAuth來保護我的API。如果您不啓動瀏覽器來執行OAuth的「登錄」部分,可能會很困難。我將登錄權限融入到我的應用程序中,並實際實現了封面下的令牌交換。涉及太多的代碼發佈在這裏,但它的效果很好。顯然,HTTPS對於額外的安全級別是期望的。

0

如果您可以從您自己的應用程序的包管理器中獲得某種簽名,則可以使用混淆來希望使其變得更加困難,並且將包管理器中籤名的簽名/哈希值作爲HMAC的關鍵-sha1。

可能要試試這個(How to get APK signing signature?

如果你這樣做,它將使使用更加困難。顯然,它仍然可以被反編譯,但是如果它們重新編譯它以進行調試等,它將會有錯誤的關鍵。然後,他們必須在根設備上創建自己的包管理器才能獲得簽名。

+0

唯一的問題是,任何人都可以獲得簽名的散列。所以這可能很容易被破壞,除非你將它傳入一些代碼以進一步混淆它。 – Chrispix

相關問題