Mobile Security
Overview
モバイルについてのセキュリティをまとめたセクション。
機密情報の保存先について
2025年現在、モバイルアプリにおいてパスワードやトークンなどの機密情報を安全に保存するには、「セキュアストレージ」と呼ばれる専用の保存領域を使うのが常識となっています。
iOS: Keychain
- Appleが提供する暗号化付きストレージ機構
- OSによって保護されており、アプリ間で共有できない
- Touch ID / Face ID との連携も可能
- パスワード、トークン、鍵などを保存するのに最適
Android: Keystore + EncryptedSharedPreferences
- Android 6.0+では Keystore によるハードウェアベースの鍵管理が可能
- 実際の値の保存には EncryptedSharedPreferences や EncryptedFile を組み合わせる
- 鍵はアプリ外に漏れず、内部処理のみで利用される
保存してはいけない場所
- SharedPreferences / NSUserDefaults(暗号化されていない)
- SQLite(平文)※使用するなら SQLCipher で暗号化を
- ローカルファイル(.txt、.logなど)
- SDカードやクラウド同期領域
SQLiteを使う場合は?
SQLite はファイルベースのDBであるため、暗号化なしで保存すると中身が容易に取得される可能性があります。保存が必要な場合は、次の対策を取りましょう:
SQLCipherなどを使ってデータベース全体を暗号化- 鍵は Keystore や Keychain で管理し、ハードコードしない
JWTは保存すべきか?
JWT(JSON Web Token)は、一時的なトークンであるとはいえ、アクセス権を持つ重要な情報です。適切に保護されないと、不正アクセスやセッションハイジャックの原因になります。
保存の必要性と理由
- JWTは外部サービスや自社APIへのアクセス権を含むため、盗まれると悪用される
- 例:盗まれたアクセストークンを用いて本人になりすましてAPIを操作できる
保存場所の推奨
| 保存先 | 安全性 | 推奨度 | 備考 |
|---|---|---|---|
| iOS: Keychain | 高 | ★★★ | 暗号化&システム保護 |
| Android: Keystore(+EncryptedSharedPreferences) | 高 | ★★★ | 鍵管理と暗号化が分離されていて安全 |
| SQLCipherで暗号化したSQLite | 中 | ★★☆ | 保存要件によっては有効だが複雑 |
| SharedPreferences / NSUserDefaults(平文) | 低 | ☆☆☆ | セキュリティ上のリスクが大きい |
| ローカルファイル(.txtなど) | 低 | ☆☆☆ | 情報漏洩の危険性が非常に高い |
運用のベストプラクティス
- 起動時にセキュアストレージからJWTを取得し、期限が切れていればリフレッシュ
- ログアウト時にはJWTを必ず削除
- 保存せず、アプリ起動中だけメモリ保持という設計もある(金融系など)
まとめ
JWTは保存が必要な場合、必ずセキュアストレージに保存すること。短命トークンであっても漏洩すれば悪用されるため、保存先の設計がセキュリティ上非常に重要となる。
補足:保存しないのがベストなケースもある
- パスワードなどは基本的に保存せず、アクセストークンのような一時的情報を活用する設計が望ましい
- セッション終了時にすべての情報を消去するなどの方針も重要