📌 この記事は Zenn に投稿した内容のアーカイブです。
はじめに
PlayFab を使ったプロジェクトで、TitleId や DeveloperSecretKey をどう管理するかは、最初に一度は悩むポイントだと思います。
自分も最初は深く考えずに、
const string TitleId = "XXXX";
const string DeveloperSecretKey = "YYYY";
のようにコードに直接書いていました。
ところが Android ビルド後に apk を確認してみると、strings コマンドで 平文のままキーが抜ける ことに気づき、
「これはさすがにまずいな……」となったのが今回のきっかけです。
問題点:apk 内に平文で残る
C# のコードに直接書いた文字列は、
IL2CPP でも
難読化をしていても
最終的に 文字列リテラルとして apk 内に残ります 。
つまり、
strings app.apk
を叩くだけで、TitleId や SecretKey が見えてしまう状態でした。
もちろん「完全に隠す」ことは不可能ですが、
平文で置いておくのはリスクが高すぎる と判断しました。
方針:コードには平文を置かない
今回の方針はシンプルです。
ソースコード内に 平文のキーを一切書かない
ビルド時に Editor 側で変換・生成する
ランタイムでは最小限の復号処理だけ行う
いわゆる「秘匿」というより、
apk を覗かれたときに即バレしない状態を作る のが目的です。
実装概要
実装は以下の流れにしました。
Editor フォルダ内
TitleIdとDeveloperSecretKeyを Json で管理
ビルド前処理で
Json を読み込む
XOR 変換した文字列を生成
それを保持する C# クラスを自動生成
ランタイムでは
- XOR で元の文字列に戻して使用
また、
ビルドターゲット変更時
ビルド実行時
Editor 上での実行時
のどのケースでも 常に最新のクラスが生成される ようにしています。
ビルドポストプロセスの仕組み
Editor 側では以下のインターフェースを利用しました。
IActiveBuildTargetChangedIPreprocessBuildWithReport
これにより、
Android / iOS 切り替え時
CI での自動ビルド時
でも、確実に変換処理が走るようになります。
さらに、
[InitializeOnLoad]
を付けることで、
Editor 起動時や Play 実行時でもクラスが生成される ようにしています。
これにより、
Editor 実行だけ例外になる
生成忘れで古いキーを使ってしまう
といった事故も防げます。
ランタイム側は最小限に
ランタイム側では、
生成されたクラスから文字列を取得
XOR で復号
PlayFab SDK に渡す
だけです。
複雑なことは一切せず、
Editor に責務を寄せる 構成にしています。
この方法の限界と割り切り
もちろん、この方法でも:
本気で解析されれば復号は可能
完全なセキュリティ対策ではない
という前提は変わりません。
ただ、
strings 一発で見える状態
平文がそのまま残っている状態
に比べると、
最低限のハードルは確実に上げられる と考えています。
「やらないよりは明確にマシ」というラインです。
おわりに
今回の対応は、
小〜中規模プロジェクト
クライアントのみで完結する構成
を想定した現実的な落としどころです。
本格的なセキュリティが必要な場合は
当然サーバー側で管理すべきですが、
「今のフェーズで、何もしないのは怖い」
という場合には、一つの選択肢になると思います。