iT邦幫忙

2026 iThome 鐵人賽

DAY 15
0
Vibe Coding

上岸用AI,看小白如何從無到有的用Vibe Codeing開發遊戲系列 第 15 篇

Day 15:門市點數與防弊演算法 —— Server-Authoritative 模式、HMAC 簽章

  • 分享至 

  • xImage
  •  

🌕 9/25 中秋節快樂! 在這個月圓人圓的中秋佳節,祝全體 Coder:

  1. 「柚」在寫 Code 嗎? 願大家今晚都不用 On-call 跑緊急 Hotfix!
  2. 祝大家系統平平安安,「月圓人也『圓』」 —— 肚子吃得圓滾滾,專案進度與 Compile 都能完美圓滿!
  3. 中秋烤肉香噴噴,「腸」歡不腸胃炎,系統記憶體更是 Leak 不「殘」留!
  4. 「醬」子寫 Code 就對了! 願大家的 Bug 都像嫦娥一樣「奔月」遠離地球,永遠不再 Return!

笑話開完,專案還是要繼續!上一篇完成了大廳家具擺設,今天我們要來探討遊戲開發中最關鍵的防線 —— 門市點數結算與後端防弊機制。如果點數能被玩家隨意竄改,實體門市的折抵兌換機制就會潰敗。


1. 前後端 HMAC-SHA256 Payload 防竄改簽章實作

為了防止中間人攻擊(MITM)或攔截封包修改分數,我們在 Ktor 後端與 Cocos 前端建立了 HMAC-SHA256 簽章機制:

前端(Cocos / TypeScript)生成簽章:

// CryptoUtils.ts
import CryptoJS from 'crypto-js';

export function generateHmacSignature(payload: string, secretKey: string): string {
    return CryptoJS.HmacSHA256(payload, secretKey).toString(CryptoJS.enc.Hex);
}

// 發送結算 Request
async function submitGameScore(scoreData: object) {
    const payload = JSON.stringify({ ...scoreData, timestamp: Date.now() });
    const signature = generateHmacSignature(payload, "YOUR_SERVER_SECRET_KEY");

    await fetch("/api/game/submit", {
        method: "POST",
        headers: {
            "Content-Type": "application/json",
            "X-Signature": signature
        },
        body: payload
    });
}

後端(Kotlin Ktor)Interceptor 驗證簽章:

// SecurityPlugins.kt
fun ApplicationCall.verifyHmacSignature(rawPayload: String, secretKey: String): Boolean {
    val clientSignature = request.headers["X-Signature"] ?: return false
    
    val mac = Mac.getInstance("HmacSHA256")
    val secretKeySpec = SecretKeySpec(secretKey.toByteArray(), "HmacSHA256")
    mac.init(secretKeySpec)
    
    val serverHash = mac.doFinal(rawPayload.toByteArray())
    val serverSignature = serverHash.joinToString("") { "%02x".format(it) }

    return serverSignature.equals(clientSignature, ignoreCase = true)
}


💡 鐵人賽小知識:什麼是「重放攻擊(Replay Attack)」?如何防範?

> Tech Tip:就算黑客解不開 HMAC 密鑰,他依然可以把合法的結算封包錄下來,然後「重複發送 100 次」來刷點數!防範方法是在 Payload 中加入 Timestamp(時間戳記)與 Nonce(一次性隨機字串)。Ktor 後端在收到請求時,若發現 Math.abs(currentTime - timestamp) > 30秒,或是該 Nonce 已經被使用過(存於 Redis 5 分鐘快取中),就立刻退回請求!


上一篇
Day 14:空間裝飾與動態家具系統 —— Node Hierarchy, Z-Order 與 PostgreSQL JSONB 實作
系列文
上岸用AI,看小白如何從無到有的用Vibe Codeing開發遊戲 共 15 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言