Lightweight Obfuscation & Change Detection
Security Scope
This feature is not encryption such as AES, and it is not a digital signature. It is a lightweight mechanism for making game Static Game Data less obvious to inspect and for detecting unexpected changes.
Do not place trust boundaries such as secrets, personal data, payment, authentication, or authorization decisions in the client. Manage them on a server.
What It Can Protect
Wiener provides lightweight obfuscation and change detection for these purposes:
- Make values in a binary harder to read directly
- Make values harder to locate through a simple text search
- Detect unexpected changes to obfuscated fields in memory after loading
- Detect a binary that differs from the generated output by checking it at load time
It does not prevent a determined analyst from recovering values, using a debugger or modification tool, recalculating a checksum, or abusing operations exposed by a legitimate client. The checksum does not provide cryptographic authenticity.
Data Obfuscation
There are two ways to enable obfuscation. Obfuscating more fields increases memory use and processing on access, so limit it to fields that need it.
Table-wide: Set encryption: True in the YAML header to obfuscate every field in fields.
# Table header (obfuscate all fields)
encryption: True
Per-field: Set encryption: True on an individual field to obfuscate only that field.
fields:
- key: DropRate
name: drop_rate
type: UInt
encryption: True # obfuscate this field only
- key: Name
name: name
type: String
# encryption omitted: normal field
Supported types: Byte, Short, UShort, Int, UInt, Long, ULong, Float, Double, String
File Change Detection
LoadBasicPack checks the binary at load time and returns an error when its contents differ from the generated output. This is intended to detect corruption or unexpected changes; it is not a substitute for a signature or authenticated encryption.
See Consistency Checks for details.
In-Memory Change Detection
Register a delegate with SetFalsifyDelegate to receive a notification when an obfuscated field changes unexpectedly after loading.
WienerManager.SetFalsifyDelegate((fieldName) => {
Debug.LogError($"Obfuscated field change detected: {fieldName}");
// Apply your project's logging or response policy.
});
This notification does not prevent unauthorized behavior by itself. Validate important game-state and payment decisions on a server as well.
Detailed Documentation
- Per-field settings: yaml-fields — encryption
- Header settings: yaml-header — encryption
- C# API: C# Format