なぜAPIキーをアプリに
埋め込まないのか
SEADICEはAI機能を持つFlutterアプリでClaude APIキーをipa/apkに直接埋め込まず、Cloudflare Workers経由の1本のプロキシで呼び出している。理由はバイナリ解析によるキー流出を防ぐためで、アプリ側のコードは数行変えるだけで済む。
APIキー直埋め込みが危険な理由
ipa・apkはstringsコマンドやjadxで簡単に逆コンパイルでき、埋め込んだ文字列はほぼ確実に抽出される。
- strings: バイナリ内の文字列を抽出する標準コマンドで、平文キーは一発で見つかる
- jadx / apktool: apkをJavaソースやリソースに逆変換し、難読化していないキーを露出させる
- 流出後の被害: キーが漏れると第三者に無制限でAPIを叩かれ、従量課金がそのまま請求される
Cloudflare Workersプロキシの構成
SEADICEはclaude-proxy.seadice-lite.workers.devという1つのWorkerを全アプリで共用し、APIキーはCloudflare SecretsにANTHROPIC_API_KEYとして保存している。
| 構成要素 | 役割 |
|---|---|
| Flutterアプリ | Workerのエンドポイントにmodel・messagesをPOSTするだけ |
| Cloudflare Worker | リクエストを中継し、Cloudflare SecretsからAPIキーを注入 |
| Cloudflare Secrets | ANTHROPIC_API_KEYを暗号化保存。コードにもipaにも残らない |
| Anthropic API | Workerからのリクエストのみを受け付ける実質的な唯一の呼び出し元 |
アプリ側の実装は数行で済む
アプリ側はAnthropicのエンドポイントの代わりにWorker URLへPOSTするだけで、既存のリクエスト形式をそのまま流用できる。
final res = await http.post(
Uri.parse('https://claude-proxy.seadice-lite.workers.dev'),
headers: {'content-type': 'application/json'},
body: jsonEncode({
'model': 'claude-haiku-4-5-20251001',
'max_tokens': 200,
'messages': [{'role': 'user', 'content': 'your prompt'}],
}),
);
キー更新時の運用
キーを更新・再発行する際も、差し替えはWorker側の1コマンドで完結し、公開済みのアプリを再ビルド・再申請する必要がない。
cd hiragana-ai-worker && wrangler secret put ANTHROPIC_API_KEY
診断系AIアプリ群のように個別提案にClaude APIを使う機能は、この構成を前提に設計している。プロキシを1本に集約しているため、モデル変更や料金プラン変更もWorker側の修正だけで全アプリに反映できる。
Related
Claude APIのはじめかた — キー取得・Python実装・モデル選択・ストリーミングまで →
← ブログ一覧に戻る