2013-09-25 53 views
4

我在Google應用程序引擎上獲得了一個休息服務器,我只希望我的應用程序能夠撥打我的服務器。如何防止任何人與我的服務器進行通信,除了我的Android應用程序

我可以在Google應用引擎上打開哪個安全選項來支持此操作?如果不是,我能做什麼?

我知道你可以限制訪問某些網頁與follwing,但我不知道它可以應用到REST調用

<security-constraint> 
     <web-resource-collection> 
      <url-pattern>/cron/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <role-name>admin</role-name> 
     </auth-constraint> 
</security-constraint> 
+0

不幸的是,沒有可靠的方式導致黑客擁有超過您可以控制的權限(他們可以反彙編應用程序並恢復您的算法,然後在其他軟件中重現)。 –

回答

0

有幾個選項:

  • 首先,你可以限制通過IP。如果您的Android應用程序每次都獲得動態IP,這不是一個好方法。
  • 其次,您可以在只有您知道的服務器和客戶端上使用一些算法。服務器可以將數據發送到客戶端,客戶端運行該算法並修改數據。然後發回服務器。服務器也運行該算法並檢查響應。如果響應等於服務器計算出的值,則服務器知道客戶端已被授權。在這種情況下,從服務器發送的初始數據應該每次都有所不同。
  • 第三,你可以使用一些公開的散列函數,而不是你自己的算法。這個想法是一樣的。服務器使用相同的散列函數並檢查客戶端的響應是否與其計算相同。
0

執行此操作的規範方法是使用SSL和客戶端證書。我不確定App Engine是否支持此功能。

但是請注意,如果你發佈你的APK,那麼你不能僅僅依靠隨APK分發的任何東西 - 這將是可能的(如果不太可能,取決於你有多高調作爲目標)來提取欺騙應用程序所需的任何信息。

2

在openssl中生成privatekey/publickey對。在應用程序分發中分發公鑰。有一個名爲appName的自定義http頭,並將appname(一個唯一的不可預知的大數位)加密併發送出去。確保您的代碼被混淆,以便沒有人能夠查看該應用程序的名稱。然後,即使有人跟蹤了http調用,您也正在進行加密,該appname將作爲加密值顯示。在您的服務器端使用私鑰解密應用程序名稱。希望這可以幫助。

+0

這是否意味着如果有人在連接上偵聽並看到加密值,那麼他們可以使用它來僞裝成我的應用程序,只需向我的服務器發送加密值,然後我的服務器就會解密它,它將起作用 – code511788465541441

+0

這是非常好的題。實際上,您可以爲特定會話生成AES密鑰。現在使用AES密鑰對AppName進行加密,並使用公共RSA密鑰對AES密鑰進行加密併發送加密的AES密鑰和AppName值。您可以使用nonce來防止重播攻擊。由於AES密鑰僅對會話有效,並且每次登錄都會更改,所以沒有人會獲得AppName。爲了防止重放攻擊,使用nonce。請參閱我的回答http://stackoverflow.com/questions/19010067/restful-login-proper-implementation/19024952#19024952。 – Satish

+0

您只需將http://www.ietf.org/rfc/rfc2617.txt引用爲nonce用法。我的其他答案可能會讓人困惑。 – Satish

1

(三個答案已經和所有然後我自己不同的想法在這個問題上 - 這樣一個很好的問題,我認爲)

這是我的理解是這樣做的推薦/規範的方法這(對谷歌)是OATH2。谷歌已經認識到OATH2是棘手的,他們試圖簡單的是雲終端,以及針對Android客戶端的Google Play服務。造成這種情況的說明在這裏:

https://developers.google.com/appengine/docs/java/endpoints/consume_android#Java_Making_authenticated_calls

注意的是,雖然文檔強調用戶認證,它也支持應用程序的認證。

我不知道(但願意)是如何爲非終端應用程序的相同的事情,所以我想這只是一個部分的答案。

1

簡短的回答是,你不能,至少不是完全安全。

https://security.stackexchange.com/questions/826/how-can-i-securely-authenticate-the-client-application-sending-me-data

龍的回答是,你可以把它難以黑客。通常這是通過在應用程序中嵌入密鑰,混淆密鑰並混淆獲取密鑰的代碼來實現的。這並不能讓某人找到鑰匙,只是更難。

一個強大的消費系統外面有微軟的Silverlight DRM的,你可能要探討如何工作的:http://www.iis.net/learn/media/iis-media-services/content-protection-in-silverlight

1

你可以做訪問時,您的所有REST服務需要一個訪問鍵&祕密。應用程序可以將這些存儲在配置設置下,並在發送到應用程序商店時留空。

然後,當您下載應用程序時,您可以進入配置設置並插入您爲REST服務設置的密鑰&。 (這樣可以防止任何人訪問服務,因爲您手動添加使用的密鑰+密鑰)

我建議在服務器上設置所有未經授權的訪問嘗試的IP日誌,以便您可以創建黑名單,如果有人以無效的訪問嘗試發送您的Web服務垃圾郵件。

然後最重要的是你可以通過HTTPS完成這一切。

相關問題