📌 この記事は Zenn に投稿した内容のアーカイブです。

はじめに

PlayFab を使ったプロジェクトで、
TitleIdDeveloperSecretKey をどう管理するかは、最初に一度は悩むポイントだと思います。

自分も最初は深く考えずに、

const string TitleId = "XXXX";
const string DeveloperSecretKey = "YYYY";

のようにコードに直接書いていました。

ところが Android ビルド後に apk を確認してみると、
strings コマンドで 平文のままキーが抜ける ことに気づき、
「これはさすがにまずいな……」となったのが今回のきっかけです。


問題点:apk 内に平文で残る

C# のコードに直接書いた文字列は、

  • IL2CPP でも

  • 難読化をしていても

最終的に 文字列リテラルとして apk 内に残ります

つまり、

strings app.apk

を叩くだけで、TitleId や SecretKey が見えてしまう状態でした。

もちろん「完全に隠す」ことは不可能ですが、
平文で置いておくのはリスクが高すぎる と判断しました。


方針:コードには平文を置かない

今回の方針はシンプルです。

  • ソースコード内に 平文のキーを一切書かない

  • ビルド時に Editor 側で変換・生成する

  • ランタイムでは最小限の復号処理だけ行う

いわゆる「秘匿」というより、
apk を覗かれたときに即バレしない状態を作る のが目的です。


実装概要

実装は以下の流れにしました。

  1. Editor フォルダ内

    • TitleIdDeveloperSecretKey を Json で管理
  2. ビルド前処理で

    • Json を読み込む

    • XOR 変換した文字列を生成

    • それを保持する C# クラスを自動生成

  3. ランタイムでは

    • XOR で元の文字列に戻して使用

また、

  • ビルドターゲット変更時

  • ビルド実行時

  • Editor 上での実行時

のどのケースでも 常に最新のクラスが生成される ようにしています。


ビルドポストプロセスの仕組み

Editor 側では以下のインターフェースを利用しました。

  • IActiveBuildTargetChanged

  • IPreprocessBuildWithReport

これにより、

  • Android / iOS 切り替え時

  • CI での自動ビルド時

でも、確実に変換処理が走るようになります。

さらに、

[InitializeOnLoad]

を付けることで、
Editor 起動時や Play 実行時でもクラスが生成される ようにしています。

これにより、

  • Editor 実行だけ例外になる

  • 生成忘れで古いキーを使ってしまう

といった事故も防げます。


ランタイム側は最小限に

ランタイム側では、

  • 生成されたクラスから文字列を取得

  • XOR で復号

  • PlayFab SDK に渡す

だけです。

複雑なことは一切せず、
Editor に責務を寄せる 構成にしています。


この方法の限界と割り切り

もちろん、この方法でも:

  • 本気で解析されれば復号は可能

  • 完全なセキュリティ対策ではない

という前提は変わりません。

ただ、

  • strings 一発で見える状態

  • 平文がそのまま残っている状態

に比べると、
最低限のハードルは確実に上げられる と考えています。

「やらないよりは明確にマシ」というラインです。


おわりに

今回の対応は、

  • 小〜中規模プロジェクト

  • クライアントのみで完結する構成

を想定した現実的な落としどころです。

本格的なセキュリティが必要な場合は
当然サーバー側で管理すべきですが、

「今のフェーズで、何もしないのは怖い」

という場合には、一つの選択肢になると思います。