軽量難読化・変更検知
セキュリティ上の位置付け
本機能は AES などの暗号化や電子署名ではありません。ゲームの Static Game Data をそのまま読み取りにくくし、想定外の変更に気付きやすくするための軽量な仕組みです。
秘密情報、個人情報、課金・認証・権限判定などの信頼境界はクライアントに置かず、サーバー側で管理してください。
保護できる範囲
Wiener は、次の用途に使える軽量な難読化・変更検知を提供します。
- バイナリ内の値を直接読み取りにくくする
- テキスト検索だけでは値を見つけにくくする
- ロード後、難読化対象フィールドの値が想定外に変化したことを検知する
- ロード時に、出力時と異なるバイナリをチェックサムで検知する
一方、解析者による復元、デバッガーや改造ツールによる読み取り、チェックサムの再計算、正規クライアントを経由した不正操作は防止できません。チェックサムは暗号学的な真正性を保証するものではありません。
データ難読化
難読化の指定方法は2種類あります。対象が増えるほどメモリ使用量が増え、アクセス時の処理も増えるため、必要なフィールドに限定してください。
ヘッダーで一括指定: encryption: True を設定すると、fields の全フィールドを難読化します。
# テーブルヘッダー(全フィールドを難読化)
encryption: True
フィールド単位で指定: 各フィールドに encryption: True を設定すると、そのフィールドだけを難読化します。
fields:
- key: DropRate
name: drop_rate
type: UInt
encryption: True # このフィールドだけを難読化
- key: Name
name: name
type: String
# encryption 未指定: 通常のフィールド
対応する型: Byte, Short, UShort, Int, UInt, Long, ULong, Float, Double, String
ファイル変更の検知
LoadBasicPack のロード時にチェックサムを照合し、出力時と内容が異なる場合はエラーを返します。これはファイル破損や意図しない変更の検知を目的としたもので、署名や認証された暗号化の代替ではありません。
詳細は 整合性検知 を参照してください。
メモリ上の変更検知
SetFalsifyDelegate でデリゲートを登録すると、ロード後に難読化フィールドの値が想定外に変化した際に通知を受け取れます。
WienerManager.SetFalsifyDelegate((fieldName) => {
Debug.LogError($"難読化フィールドの変更を検知: {fieldName}");
// ログ送信など、プロジェクトの方針に沿った処理を行う
});
この通知だけで不正操作を防止できるわけではありません。ゲーム進行や課金などの重要な判定は、サーバー側でも検証してください。
詳細ドキュメント
- フィールド単位の設定: yaml-fields — encryption
- ヘッダー設定: yaml-header — encryption
- C# API: C#フォーマット