抽空又來更新了,越來越懶了,而且感覺也沒得寫了,之后可能有空更新一下!最近看了粉絲們的評論區和私信,發現大家在防護驗證的知識體系還是缺少一些基本功。除了我們內部自己的平臺驗證之外,其實不同的應用商店也都提供了一些基礎功能幫助我們驗證流量。我們可以用起來。對于營銷小伙伴了解一些也是很不錯的。所以這期總結一下目前常見的平臺都如何配置這些套件和功能,這個功能可以自己做,也可以交給MMP(如果你沒有這個精力和資源的話,算是省心省力,沒有打廣告哦)。分三個平臺講:Google Apple AmazonGoogle License Verification Library(LVL)Google License Verification Library (LVL) 的主要作用是驗證應用的合法授權,以防止未經授權的安裝。為了防作弊,Google LVL通過Google Play License Server進行授權驗證,應用啟動時會調用LVL,請求GP服務器進行授權驗證。在GP的服務器返回驗證結果(LICENSED、NOT_LICENSED或ERROR)后,應用會根據驗證的結果決定是否允許此次運行。https://developer.android.com/google/play/licensing/server-side-verificationhttps://developer.android.google.cn/google/play/licensing/client-side-verification.html#app-publishing為了防止破解或偽造授權信息,LVL采用了以下安全措施:Google Play的服務器返回的授權響應帶有數字簽名,使用Google私鑰加密。作弊渠道無法偽造服務器響應,因為他們無法偽造Google的簽名。在本地應用中,LVL 需要用GP提供的公鑰驗證簽名的真實性。
String signedData = response.getSignedData();?//?Google Play 返回的授權數據String signature = response.getSignature(); ?//?Google Play 返回的簽名boolean isValid = verifySignature(signedData, signature, PUBLIC_KEY);if?(isValid) {? ? // 授權通過}?else?{? ? // 可能是偽造的授權信息,拒絕訪問}
Google LVL在每次請求時會加入隨機數 (nonce),防止重放攻擊(Replay Attack)。這樣,即使作弊渠道試圖緩存上一次的授權響應并重復使用,系統仍然能檢測到。
long?nonce =?new?SecureRandom().nextLong();?sendLicenseRequest(nonce);
Google LVL采用了Base64編碼和一定的混淆技術,防止黑客直接篡改授權數據。攻擊者不能直接修改響應,否則簽名驗證會失敗。ProGuard/R8:LVL推薦使用ProGuard或R8來混淆代碼,防止黑客反編譯應用并繞過授權驗證。自定義驗證邏輯:Google 建議開發者不要直接使用 LVL 提供的默認實現,而是修改和混淆授權邏輯,使得破解難度提高。除了LVL自帶的機制,我還建議開發者結合Google Play Integrity API進行更嚴格的安全檢查。當然MMP平臺也提供了一些簡化版本的服務,我們以Appsflyer為例:廣告主需要將配置好的property同步給Appsflyer的CSM。Appsflyer的CSM將會開啟測試模式(只標記不檢出),如果數據穩定的話,就可以同步到正式版了。1.Appsflyer需要購買Protect360服務后才能夠開啟驗證。2.Appsflyer將這類型Fraud標記的原因算作Bots。https://support.appsflyer.com/hc/en-us/articles/17329535522961-Setting-up-the-Google-License-Verification-Library-LVLApple App Store install validation官方說法如下:Apple App Store Install Validation是一種驗證iOS應用的安裝來源和合法性的機制,主要用于防止盜版、偽造安裝、未經授權的運行等情況。它可以確保應用只在 App Store下載和安裝,而不是通過越獄設備、第三方商店或企業簽名的方式繞過授權。蘋果沒有提供SDK,Apple是利用自己的生態完成驗證。(1)Receipt Validation(收據驗證)每個應用都有一個receipt,用于驗證應用來源以及是否合法安裝,以及是否有合法的內購。該收據包含設備ID、購買信息、Bundle ID等信息,并由Apple簽名。我們可以在應用啟動時驗證收據,確保應用是從Apple下載的,而不是從第三方來源sideload安裝的。一般收據會存儲在這里:
/var/mobile/Applications/{App?UUID}/StoreKit/sandboxReceipt
import?requestsimport?base64
# 讀取 receipt 文件with?open("receipt",?"rb")?as f:? ? receipt_data = base64.b64encode(f.read()).decode()
# 發送到 Apple 服務器驗證response = requests.post("https://buy.itunes.apple.com/verifyReceipt", json={? ??"receipt-data": receipt_data,? ??"password":?"your_shared_secret"})
# 解析返回的 JSON 結果print(response.json())
(2) App Store Server API(防止假安裝 & 內購欺詐)用于檢測應用安裝來源,并防止黑客利用偽造安裝數據獲取獎勵(如廣告歸因作弊)。Apple提供App Store Server API,我們可以使用getTransactionHistory或getRefundHistoryAPI 來檢查用戶是否真的從應用下載并購買了應用或訂閱。這個API不會被篡改,可以有效檢測假裝安裝或偽造支付信息的情況。(3) Device Integrity Checks(設備完整性檢查)用于檢查設備是否越獄(Jailbroken),并檢測是否運行在模擬器或被 Hook。
func?isDeviceJailbroken() -> Bool?{? ??let?paths = ["/Applications/Cydia.app",?"/Library/MobileSubstrate/MobileSubstrate.dylib",? ? ? ? ? ? ? ? ?"/bin/bash",?"/usr/sbin/sshd",?"/etc/apt"]? ??for?path?in?paths {? ? ? ??if?FileManager.default.fileExists(atPath: path) {? ? ? ? ? ??return?true? ? ? ? }? ? }? ??return?false}
Amazon Digital Rights Management APIAmazon沒有直接對應Google License Verification Library (LVL)的官方SDK,但Amazon提供了Appstore SDK,其中的DRM (Digital Rights Management) API可以實現類似的功能。它允許廣告主檢查應用是否是通過Amazon Appstore合法下載的,并防止盜版或未經授權的使用。(可以重點防治某家!!!)首先,我們需要集成Amazon Appstore SDK,在應用中添加 Amazon 提供的Appstore SDK(可從 Amazon Developer Console 下載)。https://developer.amazon.com/zh/docs/appstore-sdk/integrate-appstore-sdk.html然后在代碼中調用DRM API,就可以實現通過LicenseVerifier進行驗證了:
import?com.amazon.device.drm.LicensingService;import?com.amazon.device.drm.model.LicenseResponse;import?com.amazon.device.drm.LicensingListener;
public?class?MyActivity?extends?Activity?{? ??@Override? ??protected?void?onCreate(Bundle savedInstanceState) {? ? ? ??super.onCreate(savedInstanceState);? ? ? ??LicensingService.verifyLicense(new?LicensingListener() {? ? ? ? ? ??@Override? ? ? ? ? ??public?void?onLicenseValidated(LicenseResponse licenseResponse) {? ? ? ? ? ? ? ??if?(licenseResponse.getLicenseStatus() ==?LicenseResponse.LicenseStatus.LICENSED) {? ? ? ? ? ? ? ? ? ??? ? ? ? ? ? ? ? } else {? ? ? ? ? ? ? ? ? ? // 未授權(盜版、無效賬戶等)? ? ? ? ? ? ? ? }? ? ? ? ? ? }? ? ? ? });? ? }}
之后把我們的應用已上傳到Amazon Appstore,并啟用了DRM保護,就完成了全部操作啦。為了防止破解或偽造授權信息,DRM采用了以下安全措施:Amazon DRM服務器的響應包含簽名數據,并使用Amazon的私鑰加密。應用必須用Amazon提供的公鑰驗證返回數據的真實性,防止偽造授權信息。DRM授權信息與用戶的Amazon賬戶綁定,而不是僅僅存儲在本地設備上。每次驗證時,Amazon服務器會檢查當前設備是否屬于該賬戶,防止拷貝授權數據到其他設備使用。Amazon DRM SDK會加密存儲授權信息,并采用校驗機制,防止作弊渠道手動修改本地授權數據。如果檢測到數據被篡改,應用可以拒絕運行。當然,如果要驗證IAP的話,也可以用Amazon IAP (In-App Purchasing) 進行二次授權檢查,確保購買驗證的安全性。