2017-09-14 75 views
1

Android在應用購買文檔中說要驗證服務器上的購買,而不是在設備上購買,因爲否則攻擊者可能會反編譯該應用並自動驗證購買。那麼,如何在服務器上進行驗證呢?我將用僞代碼來說明。以下是設備驗證方案1。爲什麼要在服務器上驗證Play商店購買?

public boolean verify(data){ return Security.verifyPurchase(data); }

攻擊者替換此:

public boolean verify(data){ return true; }

方案2,驗證服務器上:

public boolean verify(data) { return verify("https://verify.server.com",data); }

攻擊者使用此替代

public boolean verify(data){ return true; }

所以唯一的方法是,如果購買的產品也是從服務器提供的,對吧?如果它正在解鎖某個功能,則必須從服務器上下載該功能所無法解決的問題,否則攻擊者只能反編譯並驗證購買(或反編譯並打開功能,跳過購買)。

+1

原因是因爲您的僞代碼並不完全是購買驗證流程的工作原理。讓我們暫時考慮用戶名/密碼認證 - 爲什麼黑客不會像在您的示例中那樣將驗證用戶的代碼更改爲「true」?通常情況下,這是因爲沒有驗證函數返回一個布爾值 - 通常服務器實際上是在驗證後返回購買內容等數據。這些數據不會存儲在設備上,黑客無法訪問它。試試看這裏作爲一個例子:https://oauth.net/articles/authentication/ –

+0

那麼這就是我說的 - 如果所有的服務器確實是驗證購買,這是行不通的。服務器還必須返回客戶需要的東西,以便將購買的商品提供給用戶。如果您購買的產品不適合自己,那麼您將不得不通過某種方式讓它以這種方式工作。我只是確保我正確理解這一點,並且我不會錯過任何東西。 – nasch

+0

我更新了我的評論。如果您不熟悉OAuth,請查看OAuth。它提供瞭如何工作的很好的細節。 –

回答

3

Play Store購買應該在單獨的服務器上進行驗證的原因是,「攻擊者」可以相對容易地對您的apk進行反向工程,但是對於服務器而言(很可能)並非如此。

它也是在the documentation解釋如何實現這一目標

驗證服務器

上通過一個服務器上實現簽名驗證邏輯 ,你很難讓攻擊者進行反向工程師 您的APK文件。這保留了您的邏輯檢查的簽名的完整性。

要驗證的購買細節值得信賴的服務器上,完成 以下步驟:

  • 確保設備服務器握手是安全的。
  • 檢查返回的數據簽名和orderId,並驗證orderId是以前沒有處理過的唯一值。
  • 確認您的應用程序密鑰已經簽名了您處理的INAPP_PURCHASE_DATA。
  • 使用Google Play Developer API中的ProductPurchase資源(適用於應用內商品)或SubscriptionPurchase資源(適用於 訂閱)驗證購買響應。這一步是 特別有用,因爲攻擊者無法創建對Play商店購買請求的 的模擬響應。

如果它的解鎖功能,您將不得不從服務器下載東西的功能,不能沒有

工作是的,沒錯,看further down

保護您的解鎖內容

爲防止惡意用戶重新分發您未解鎖的內容,請勿將其捆綁到您的APK 文件中。請執行以下操作之一:

  • 使用實時服務來傳送您的內容,例如內容 供稿。通過實時服務傳送內容可以讓您的內容保持新鮮。
  • 使用遠程服務器來傳送您的內容。
相關問題