首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 離線激活授權:機器碼綁定充值卡算法設計與防破解策略

     編輯:程式設計綜合問答

需求分析

批量生產設備,每台設備唯一機器碼。使用者購買充值卡(帳號/密碼/授權碼),輸入後驗證通過解鎖功能。**設備完全離線**,無法連網驗證。

核心挑戰

離線環境下,**所有驗證邏輯在客戶端**,攻擊者可反編譯、Hook、修改二進制繞過檢查。無法做到絕對安全,只能**提高破解成本**。

推薦架構:非對稱加密 + 機器碼綁定

1. 密鑰生成 (廠方離線完成)

  • 生成 RSA 2048/4096 密鑰對:私鑰 (簽名) 絕不離開廠方伺服器,公鑰 (驗證) 燒錄進每台設備
  • 每台設備生成唯一機器碼:CPU ID + 主板序號 + MAC + 隨機鹽 → SHA-256 → 取前 16 字節 (Base64 編碼)

2. 授權碼生成 (廠方後台/離線工具)


// 輸入:機器碼、授權類型、有效期、功能位圖
// 輸出:授權碼 (Base64)
String payload = machineCode + "|" + featureBitmap + "|" + expiryTimestamp + "|" + nonce;
byte[] signature = RSA_SIGN(privateKey, payload.getBytes(StandardCharsets.UTF_8));
String authCode = Base64.encode(payload + "." + signature);

3. 設備端驗證 (純離線)


public boolean verifyLicense(String authCode, String machineCode) {
    try {
        String[] parts = authCode.split("\\.");
        if (parts.length != 2) return false;
        
        String payload = new String(Base64.decode(parts[0]));
        byte[] signature = Base64.decode(parts[1]);
        
        // 1. 驗證簽名
        if (!RSA_VERIFY(publicKey, payload.getBytes(), signature)) return false;
        
        // 2. 解析 payload
        String[] fields = payload.split("\\|");
        if (fields.length < 4) return false;
        String licensedMachine = fields[0];
        long expiry = Long.parseLong(fields[2]);
        
        // 3. 機器碼綁定檢查
        if (!machineCode.equals(licensedMachine)) return false;
        
        // 4. 有效期檢查 (需可信時間源,見下文)
        if (System.currentTimeMillis() > expiry) return false;
        
        // 5. 解析功能位圖,啟用對應功能
        int features = Integer.parseInt(fields[1]);
        enableFeatures(features);
        
        return true;
    } catch (Exception e) {
        return false;
    }
}

關鍵難點:離線可信時間

防破解加固清單

  1. 代碼混淆:ProGuard/R8 + 字符串加密 (DexGuard/AndResGuard)
  2. 完整性校驗:啟動時計算 .so/.dex/資源文件雜湊,對比內建值
  3. 反調試:檢測 isDebuggerConnected、ptrace、時間差異
  4. 關鍵邏輯下沉 .so:JNI 實現驗證核心,提高逆向門檻
  5. 動態授權碼:每次驗證要求不同 nonce,防重放 (需時間同步)
  6. 白盒加密:公鑰不以明文儲存,運算中展開 (極高成本)

參考資源

Android 軟體註冊碼/授權碼設計實現 (CSDN)

總結

離線授權核心:**RSA 非對稱簽名 + 機器碼綁定 + 公鑰燒錄設備**。私鑰絕不出廠。接受「離線不可絕對安全」,通過**加固提高破解成本**超過授權價值。若極高安全需求,需硬體安全模組 (SE/TEE/HSM) 支援。

  1. 上一篇文章:
  2. 下一篇文章:
方案原理繞過難度
RTC 硬體時鐘讀取主板電池供電的 RTC中 (可修改 BIOS/硬體)
單調時間 + 重啟檢測SystemClock.elapsedRealtime() + 記錄上次時間,檢測時間倒退中高 (需 Root 修改內核)
安全元件 (SE/TEE)硬體隔離的可信時間極高 (需硬體支援)
無時間限制 (永久授權)僅驗證機器碼與功能最簡單,無時間攻擊面