整合性検知とカスタムハンドラ
Wienerはマスターデータとソース定義の不整合を自動的に検知し、検知後の挙動をカスタムハンドラで制御できます。
Unity Asset版 1.0.0での検知範囲
このページで説明するのは、現在販売中のUnity Asset版 1.0.0における、生成バイナリとC#ソース定義の構造的な不整合検知です。Standalone版とUE5出力はComing Soonであり、ここで説明する現行機能の範囲には含めません。
LoadBasicPackFromHash のハッシュ比較や、関連機能のチェックサムは、想定した生成物との差異、ファイル破損、意図しない変更を検知するためのものです。
セキュリティ上の境界
ハッシュやチェックサムだけでは、データの暗号学的真正性を証明できません。電子署名ではなく、攻撃者による改変防止も保証しません。攻撃者がデータと検証値の両方を変更できる環境では、改変後に検証を通過させられる可能性があります。
信頼できないファイルを、チェックサムに通ったことだけを理由に読み込ませないでください。真正性の確認が必要な配布経路では、利用側で電子署名、認証付き暗号、安全な鍵管理などを設計してください。
検知のタイミング
1. ロード時(LoadBasicPackFromHash の第二引数)
開発用ロードメソッド LoadBasicPackFromHash の第二引数に Action<string[]> デリゲートを渡すと、ロード時に不整合が見つかったクラス名の一覧が返ってきます。
WienerManager.LoadBasicPackFromHash(path, (missingTargets) => {
// missingTargets: 不整合が見つかったクラス名の配列
foreach (var target in missingTargets)
{
Debug.LogWarning($"不整合: {target}");
}
});
不整合があってもロードは成功し、ソースに存在してバイナリに存在しないデータは default 値が補填されます。
2. プロパティアクセス時(SetMissingDelegate)
SetMissingDelegate でデリゲートを登録しておくと、LoadBasicPackFromHash でロードした際に正常にロードできなかったマスターデータのプロパティへのアクセスを検知できます。
全体の使用例
var wm = new WienerManager();
wm.LoadBasicPackFromHash(path, (missingTargets) =>
{
// ロード時:不整合が見つかったクラス名の配列が返ってくる
foreach (var target in missingTargets)
{
Debug.LogWarning($"不整合: {target}");
}
});
wm.SetMissingDelegate((className) =>
{
// プロパティアクセス時:不整合なマスターへのアクセスが発生したクラス名が返ってくる
Debug.LogError($"未ロードマスターへのアクセス: {className}");
});
// Name が不整合でロードできていない場合、SetMissingDelegate のデリゲートに通知が飛ぶ
var name = wm.Item[0].Name;
本番モードと開発モードの違い
本番ロード(LoadBasicPack) | 開発ロード(LoadBasicPackFromHash) | |
|---|---|---|
| 不整合発見時 | エラーとして返却 | 第二引数デリゲートで不整合クラス一覧を通知 |
| 欠損フィールド | ロード失敗 | default 値を補填して継続 |
| プロパティアクセス検知 | — | SetMissingDelegate で検知可能 |
| 用途 | リリースビルド | 開発・CI・デバッグ |
活用シナリオ
| 環境 | やること |
|---|---|
| 開発時 | onMissingTargets でログ出力、SetMissingDelegate でEditorダイアログ |
| CI実行時 | onMissingTargets の配列が空でなければビルドエラー |
| チーム通知 | onMissingTargets の内容を Slack / Discord へ Webhook 送信 |
CSV出力
WriteCSV を使うと内部で保持しているデータをヘッダー付きCSVとして取得できます。
戻り値は Dictionary<string, string>(Key: ファイル名、Value: CSV内容)です。
var csvs = WienerManager.WriteCSV();
foreach (var csv in csvs)
{
File.WriteAllText(csv.Key, csv.Value);
}
用途
- バイナリの中身を確認したいとき
- 他ツール・スクリプトでデータを集計したいとき
- データの差分をとりたいとき(git diff等)
- 開発中のアプリからデバッグコマンドでマスターデータの中身をSlackへ送信したいとき
関連
- 軽量な難読化と変更検知 — チェックサムの用途とセキュリティ上の境界
- バージョン管理 — 開発データの本番除外
- C# API リファレンス