Hello there, ('ω')ノ
🔐 なぜ「埋め込み」が危険なのか?
アプリ開発中、つい便利さからAPIキーやパスワードをソースコードにベタ書きしてしまうことがあります。
String apiKey = "sk_test_51Hh..."; String password = "admin1234";
開発段階では便利でも、APKとしてビルドされた時点で誰でも取り出せる状態になっています。 つまり「アプリを配布した時点で秘密はバレている」と考えなければなりません。
🛠 何が「秘密情報」と見なされるのか?
種類 | 例 |
---|---|
APIキー・トークン | Stripe, Firebase, AWS, Google Mapsなどのキー |
パスワード・認証情報 | 初期設定用や管理者パスワード |
暗号化キー・IV | AESキー、初期化ベクトル |
サーバー情報 | 内部向けのエンドポイントURL、DB接続情報など |
これらがJavaコードやリソースファイル(strings.xml
など)にハードコードされていたら要注意です。
🔍 秘密情報の見つけ方:静的解析のすすめ
✅ 1. MobSFでの自動スキャン
MobSFでは、APKをアップロードするだけで「Hardcoded Secret Detection」レポートが生成されます。 以下のような結果が確認できます:
Hardcoded API Key found in MainActivity.java
Base64 encoded string suspicious: "c2VjcmV0MTIz"
→ Base64でエンコードされているだけの可能性あり
✅ 2. JadxやAPKToolでコードから直接探す
APKをJadxでデコンパイルして、以下のキーワードで検索します:
よく使われる秘密情報のパターン:
"api_key"
"secret"
"token"
"password"
"authorization"
"base64"
String token = "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI...";
→ JWTのようなトークンがそのまま埋め込まれていることも。
✅ 3. grepでソースコードを一括検索(Linux/WSLなど)
grep -rniE 'apikey|token|secret|password' ./source/
→ 特定の文字列が含まれる行番号・ファイルが一覧で表示されます。
✅ 4. Base64データにも注意!
開発者は「秘密情報を暗号化してるつもり」で、実はただBase64エンコードしているだけのケースも多いです。
String encoded = "U29tZVZlcnlTZWNyZXRWYWx1ZQ==";
→ echo "U29tZVZlcnlTZWNyZXRWYWx1ZQ==" | base64 -d
で簡単に復元できます。
🧠 診断時のチェックポイント
チェック項目 | 意図 |
---|---|
固定文字列で秘密情報が書かれていないか | "..." でAPIキーやトークンを指定していないか |
リソースファイル内に不審なキーがないか | strings.xml に秘密情報が定義されていないか |
Base64っぽい文字列が含まれていないか | 末尾が == などになっている文字列に注意 |
デバッグ用コードがそのまま残っていないか | テスト用の秘密情報がリリースに含まれていないか |
💡 開発時の対策ポイント
- 秘密情報はコードに埋め込まず、バックエンド側で管理する
- APIキーやトークンは、アプリ起動時に取得して使用する(動的に発行)
- デバッグビルドと本番ビルドでビルドフレーバーを分ける
- MobSFなどで定期的に静的解析して検出漏れを防ぐ
✅ まとめ
- JavaコードにAPIキーやトークンを直接書くのは超NG行為
- MobSFやjadxを使えば、埋め込み済みの秘密情報を発見できる
- Base64や変数名にも注意して、目立たない埋め込みも見逃さないことが重要
- セキュリティ対策の第一歩は「コード内に秘密を残さない」ことから!
Best regards, (^^ゞ