APIキーを保護する:Androidアプリ開発におけるシークレット管理のベストプラクティス
バージョン管理システム(Gitなど)を使ってプロジェクトを運用していると、APIキーが必要な外部サービスを利用する場面は多々あります。ローカルマシン上で作業しているうちは何も問題ありませんが、コードをリポジトリにプッシュするときに、APIキーが世界中に公開されてしまうのは避けたいところです。
では、アプリケーション内ではAPIキーを通常どおり使いつつ、リポジトリへアップロードする際には隠すには、どうすればよいのでしょうか?「アプリ内で普通にAPIキーを利用できる状態を保ちながら、外部には決して露出させない」——これが理想の形です。
シークレットとは何か?
そこで登場するのがシークレット(Secrets)という概念です。自分だけが知っている個人的な秘密と似ていますが、こちらは開発者向けのものです。
シークレットとは、アプリケーションの動作に不可欠でありながら、プロジェクトの外部の人間には見せてはならない重要な情報を指します。具体的にはAPIキーや認証トークンなどが該当し、本質的には「あなた自身だけが使用すべき認証情報」全般がシークレットです。ウェブサイトのパスワードを誰にも共有したくないのと同じ感覚だと考えてください。
🚨 注意: 本記事で紹介する方法は、バージョン管理システムからシークレットが漏洩することを防ぐためのものです。ただし、シークレットはアプリの一部として組み込まれているため、APKを逆コンパイルされれば発見される可能性があります。その点は十分に留意してください。
シークレットを安全に守る方法
まず、プロジェクトのルートディレクトリにlocal.propertiesファイルが存在していることを確認してください。このファイルには通常、SDKのパスなどマシン固有の情報が格納されており、リポジトリにコミットすべきではないファイルです。
このファイルがバージョン管理システムによって無視されるようにするため、.gitignoreファイルを開き、local.propertiesが記載されていることを確認しましょう。
次に、プロジェクトにSecrets Gradleプラグインを導入します。プロジェクトのルートにあるbuild.gradleファイルに、以下の行を追記してください。
buildscript {
dependencies {
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' version '2.0.1' apply false
}
}
続いて、appモジュールのbuild.gradleファイルにも、以下のようにプラグインを適用します。
plugins {
...
id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
準備ができたら、local.propertiesファイル内にAPIキーを記述します。このファイルはGitの管理対象外なので、ここに書いた内容がリポジトリに反映されることはありません。
アプリ内でシークレットを利用するには、AndroidManifest.xmlファイルのapplicationタグ内にmeta-dataタグを追加します。
<application
android:allowBackup="true"
.....>
<activity>
....
</activity>
<meta-data
android:name="YOUR_API_KEY_NAME" /// 任意の名前を指定できます
android:value="${API_KEY_NAME}"/> /// local.propertiesで定義した変数名を記述します
</application>
コードからAPIキーへアクセスするには、PackageManagerを使ってメタデータを取得する方法があります。
val applicationInfo: ApplicationInfo = application.packageManager
.getApplicationInfo(application.packageName, PackageManager.GET_META_DATA)
val apiKey = applicationInfo.metaData["YOUR_API_KEY_NAME"]
あるいは、プラグインが自動生成するBuildConfigオブジェクトから直接参照することも可能です。こちらの方がよりシンプルでしょう。
BuildConfig.YOUR_API_KEY_NAME
補足:デフォルト値の設定
チーム開発では、CI/CD環境や他のメンバーのマシンでビルドが失敗しないよう、デフォルト値を持たせておくと便利です。build.gradleに以下のような設定ブロックを追加すれば、local.propertiesが存在しない環境でもフォールバック用のプロパティファイルを読み込めます。
secrets {
defaultPropertiesFileName = "local.defaults.properties"
}
まとめ
以上の手順で、APIキーなどのシークレットをlocal.propertiesに隔離し、バージョン管理システム経由での漏洩を防げるようになりました。もうシークレットが公開される心配をせず、安心して開発を進められます。ぜひあなたのプロジェクトでも取り入れてみてください。㊙️
なお、APKの逆コンパイル対策としてさらに強固なセキュリティが必要な場合は、APIキーをサーバーサイドで保持する設計や、Google Play App Signingとの組み合わせなども検討する価値があります。
-
無料で使えるCyanogenModテーマ厳選8選!個性豊かなおすすめテーマを徹底解説
CyanogenModテーマエンジンを活用した魅力的なテーマは世の中に数多く存在しますが、その中から質の高いものを見つけ出すのは簡単ではありません。この記事では、面倒なふるい分けを済ませ、厳選した無料のCyanogenModテーマをご紹介します。テーマ適用のための事前準備これらのテーマを正しく適用するには、CyanogenMod 11、またはCMテーマエンジンに対応したカスタムROM(MahdiやParanoid Androidなど)を使用している必要があります。OnePlus Oneはroot化しなくてもテーマエンジンに対応していますが、その他の機種の多くではroot化が必要となる点に注意し
-
クリスマスに新しいAndroidスマホ・タブレットを手に入れたら?最初にやるべきこと完全ガイド
クリスマスがやってきました!新しいAndroidスマホやタブレットを手に入れた方は、まずデバイスの基本的な使い方と操作方法をマスターしましょう。この記事では、開封から快適に使いこなせるようになるまでのステップをわかりやすく解説します。 なお、Android端末にはメーカーごとにさまざまな独自UI(スキン)があるため、非常に細かい手順まではご案内できません。しかし、どの端末でも主要な機能はほぼ同じような場所に配置されているので、このガイドは幅広い機種で参考になるはずです。 SIMカードを有効化する おめでとうございます!新しいデバイスの開封が済んだところで、次は何をすればいいのでしょうか。お使