2016-02-13 13 views
8

最近我的遊戲被黑了,一個用戶向服務器提交了一個不可能的分數。評分是通過驗證校驗和和正確的數據提交的。如何驗證POST數據是否使用正確的SHA1簽名從Android應用發送?

我確信用戶必須對我的APK文件進行反向設計才能找到POST請求。

現在我想知道什麼是防止這種情況再次發生的好方法,我想過驗證應用程序的SHA1簽名。也許這樣我可以確保該應用程序由我簽名,而不是該應用程序的反向工程和更改版本。

這可能嗎?或者是否有更好的解決方案來解決這個問題?

我正在使用LibGDX。

+0

他會在帖子請求中找到額外的東西,他用網絡嗅探器無法找到什麼? – greenapps

+0

@greenapps校驗和 – Z0q

+0

在http頭中添加字段。 – zakaiter

回答

3

首先,你真的必須混淆你的代碼。您可以找到更多關於ProGuard和代碼模糊處理的信息here

其次,您可以使用Google Play服務中提供的GoogleAuthUtil,該服務適用於運行Android 2.2或更高版本的設備。

GoogleAuthUtil不正是你所需要的:

GoogleAuthUtil server communication

您的客戶端服務器調用通過HTTPS請求,去谷歌,谷歌檢查呼叫是否是由應用程式所與發行的證書籤名,然後它將請求發送到您的服務器。

你可以找到關於如何實施這個here和官方文檔here官方教程。

乾杯!

1

驗證您的應用程序的完整性是不夠的,因爲請求可能很容易在應用程序外部僞造或在內存中使用根植的android環境在內存中修改。更多,你不能完全避免它

這是所有在您的控制之外的計算機上運行的所有應用程序(所有客戶端應用程序)共享的問題。你永遠不能相信來自他們的數據。

,我可以看到它,你有幾種選擇:

  1. 混淆代碼,使應用更難以進行逆向工程。請注意,這不能解決問題,但會將其最小化。
  2. 將處理移動到服務器。服務器控制的遊戲越多,應用程序對此惡意行爲的脆弱程度就越低。
  3. 自動檢測是不可能的分數,如果你想驗證你的應用程序的簽名沒有這種可能性,這是破解太接近他們的賬戶

乾杯,

+0

我不認爲它很容易被僞造。需要註冊他們的SHA1密鑰才能使用Google Play遊戲。看起來,他們可以看到該應用程序是否是原始版本還是盜版版本。 – Z0q

+0

我並不是指手機中的其他應用程序。我的意思是由其他HTTP客戶端應用程序僞造原始請求,並知道源代碼並嗅探原始應用程序的HTTP對話。我編輯我的迴應,以引用一個紮根的android – idelvall

1

,你就必須上傳整個APK並在服務器上進行檢查。這不是一個切實可行的解決方案。

唯一安全的android應用程序是一個純粹的終端應用程序,這意味着你必須做一個服務器上的所有計算。大多數情況下,這是不可能的,因爲延遲。

這就是我們的Android開發人員必須忍受的原因:一個應用程序不是100%安全的。

但你可以接近它。

您可能想要閱讀Security with HTTPS and SSL保護您的溝通的指南。

而且你要確保你的客戶是難以破解:android app piracy preventionCombating Android App Piracy: Xposed

在你的情況,你還需要實現服務器端請求驗證: 如果你有一個遊戲服務器方面,用戶可能有一個帳戶。如果用戶發送明顯不可能的分數,則自動忽略該請求並禁止該用戶(和他的ip)。 (但也要記住,這絕不應該發生在有效請求上,否則用戶可能會生氣並停止播放。)

2

1)使用code obfuscation爲前。 Proguard的。這種工具不僅適用於Java。 但要小心 - 混淆代碼可能會運行緩慢或包含其他錯誤。

2)添加App Licencing檢查(這將檢查與谷歌Play應用程序簽名):

觀看這部影片與關注: https://www.youtube.com/watch?v=TnSNCXR9fbY 我記得他提到在運行時使用,以驗證工藝的應用程序未被黑客入侵或修改(壓縮檢查等)。 3)確保您的應用程序/服務器僅使用現代加密套件的安全連接(SSL/TLS)。這將緩解降級攻擊。

您可以使用此發生器建立配置了現代化的加密套件爲您的服務器: https://mozilla.github.io/server-side-tls/ssl-config-generator/

您也可以使用證書束縛在客戶端 - 這將減輕權威的攻擊。

請勿使用純HTTP連接。

4)使用某種要求籤署從自己的文件(如Amazon AWS一樣) 你可以得到核心理念。 http://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html

另外this article應該是有幫助的。

5)通過添加運行時間檢查,禁止在ROOT'ed設備上使用您的應用程序。由於使用了固定電話,因此更容易破解或分析您的應用。

6)您可以通過在您的在線遊戲中添加禁止系統來減少欺詐行爲 - 如果有人破解了您的應用並向您的服務器發送了錯誤的數據=>將此用戶添加到服務器端禁止列表中(通過IP或用戶ID等)。可能將用戶暫時添加到此列表中(例如24小時,7天)

7)+如果您使用Json/XML作爲網絡層的數據格式,請嘗試使用二進制格式,如Protocol Buffers。二進制序列化格式更有效且難以反向工程。

+0

非常不同意#5。 – WhoIsJohnDoe

+0

@WhoIsJohnDoe請描述你爲什麼這麼想? – dasar

+0

有足夠的有效用例來爲設備生根。我瞭解其背後的邏輯,但我仍然不同意禁止部分用戶羣,因爲「這很容易」。 – WhoIsJohnDoe

1

您可以更好地模糊您的代碼,並使用一些非常模糊的祕密來簽署您的請求。有了這個,你可以提高安全性。

但是,如果你所有的遊戲運行在客戶端上,它不能完全安全。因爲你用什麼簽名並不重要,如果你在客戶端使用它,這意味着你在客戶端擁有祕密或私鑰,然後它可以被黑客入侵。

爲了使它更安全,您需要在服務器中包含一些遊戲邏輯,然後在該邏輯中控制用戶不作弊。

相關問題