Flutter セキュリティ Tips 🔓💦
flutter でmobile 開発する場合、セキュリティにはある程度の定石が存在します。
それらを見ていきましよう。
対象者
- モバイルアプリの開発にかかわっている
- セキュリティを学習したい方
今回は、Flutter のセキュリティの学習をしたのでその Tipsを共有しようと思います。
私自身、Flutterをやり始めて 半年が経過しようとしていますが、しっかりとセキュリティの学習をするとまだまだだなと思う部分が多くありました。
難読化やルート化 など、 ???? となっている方はぜひこの記事で学習していってください☆
セキュリティで気を付けるのは以下6つ
どんどん新しいテクノロジーが生まれて、すべてのウイルスや攻撃に対象しようとすることは
現実的ではありません。従ってこれだけは気を付けるべきということを書いていきたいと思います!
- API キーの保護
- 情報とストレージの暗号化
- 通信プロトコルの制限
- ルート検出 および Jailbreak 対策
- リバースエンジニアリング 対策
- バックグラウンドスナップショットを制御
意外と多いですよね!
以下では、それぞれについて解説していきます!
API の保護について
Gitを用いて共同開発するときは、.gitignoreのファイルに .env を書いてリモートに秘密情報はあげないようにしましょう。
要するにハードコーディングはやめましょう。ってだけです。
ちなみに、ネイティブコード内のAPIkey は それぞれ以下に保存します。
Android の場合
local.properties ファイルを .gitignoreに追加して
# local.properties
google.maps_api_key=SECRET_KEY
読み込む
# android/app/build.grade
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def googleMapsApiKey = localProperties.getProperty("google.maps_api_key")
android {
defaultConfig {
manifestPlaceholders = [
googleMapsApiKey: googleMapsApiKey
]
}
}
AndroidManifest.xmlファイルに追加
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="${googleMapsApiKey}" />
iOS の場合
ios/Flutter/Release.xcconfigファイル にAPIキーを追加
GOOGLE_MAPS_API_KEY=$(SECRET_KEY)
info.plistファイル内で参照する
<key>google_maps_api_key</key>
<string>$(GOOGLE_MAPS_API_KEY)</string>
それをAppDelegate.swiftファイル に追加
GMSServices.provideAPIKey("$(GOOGLE_MAPS_API_KEY)")
情報とストレージの暗号化
暗号化とは テキストデータをエンコードされた形式に変換してデータの機密性、整合性、セキュリティを確保するプロセスです。
API通信のときは必ず暗号化するようにしましょう。
- ユーザ認証情報
- アプリのパスワード
- クレカなどの支払い情報
暗号化するときはこちらのpackageを使うといいでしょう。
ローカルストレージの暗号化
ローカルに機密情報を保存するときは、以下の packageを使います。
データを保存する前に暗号化をおこなってくれます。
AndroidではEncryptedSharedPreferencesまたはKeyStoreを使用し、iOSではKeychainを使用してデータを安全に保存します。これにより、各プラットフォームのセキュリティ機能を最大限に活用できます。
では、なぜ SharedPreferences ではいけないのでしょうか??
理由は以下のようなものです。
-
デバッグモードでアプリケーションを実行する場合、デバッガーを使ってアプリの内部状態を調べることができる。これにより、SharedPreferencesに保存されたデータも簡単に閲覧できる。
-
デバイスにマルウェアがインストールされている場合、そのマルウェアがSharedPreferencesに保存されたデータを収集することが可能。
-
Android Debug Bridgeコマンドを使えば、ファイルシステムにアクセスしてデータを取得できる。
通信プロトコルの制限
API 通信は、HTTPSとSSL/TLSプロトコルを使用します。
以下のパッケージを使用して、よりSecureな通信を実現します。
localhost の場合だけ、HTTPを許容するように設定するといいでしょう。
以下の packageを使用します。
ルート化 および Jailbreak 対策
ルート化とは、デバイスのオペレーティングシステムに対する完全な管理者権限を取得することを指します。Linuxでいうと sudo コマンドですね! これがアプリ内ですべて実行されていると考えるとおそろしいです。
通常のセキュリティメカニズムがバイパスされるため、不正なアプリケーションがシステムレベルで動作する可能性が高くなり、マルウェアやウイルスの攻撃に対してより脆弱になります。
それをチェックするためには ルート検出が必要です。
具体的には以下をチェックします。
- Superuser.apkがインストールされているか
- /sbin/suディレクトリが存在するか
- システムディレクトリに書き込み権限が付与されているか
それらのチェックは 以下のpackageを使用します。
リバースエンジニアリング 対策
release build を実行すると、 apkファイルが作成されますが、あれば実は逆コンパイルが可能です。
以下のpackageを利用して自分で作成した apkファイルを逆コンパイルしてみると、
簡単にソースコードが入手できてしまいます。
そのため、第三者に逆コンパイルされたときに、読まれないようにする必要があります。
release buildには以下の コマンドを追加しましょう。
flutter build apk --obfuscate --split-debug-info=obfuscate/android
flutter build ios --obfuscate --split-debug-info=obfuscate/ios
難読化は、クラス名やメソッド名を変更しバイナリサイズを落とす。そしてソースコードを理解しにくくすることで、悪意のある第三者によるリバースエンジニアリングを防ぎます。これにより、知的財産の保護や機密アルゴリズムの露出を防ぐことができます。
コマンド一つでこれが可能なのはいいですね。
バックグラウンドスナップショットを制御
バックグラウンドスナップショットの制御とは、アプリケーションがバックグラウンドに移行した際に、スクリーンショットが取られるのを防ぐためのセキュリティ対策です。これは、ユーザーがアプリを一時的に離れるときに、アプリの内容が他のアプリやシステムUI(例えば、アプリスイッチャー)によってキャプチャされるのを防ぐために重要です。
イメージはこんな感じです。
以下のpackageを利用します。
まとめ
いかがだったでしょうか。私自身も記事をかいてかなり勉強になりました。
やはり、情報を扱う プロとして心得ておきたいですね!
よかったら、フォローおねがいします。
フォロバします。
頑張って勉強していきましょう ☆
参考文献はいかになります。
Discussion